diff --git a/README-CN.md b/README-CN.md index 3b264ba..c149c59 100644 --- a/README-CN.md +++ b/README-CN.md @@ -9,6 +9,10 @@ pip3 install -r requirements.txt ``` +# 可测试命令 + +CTS 可以测试的命令及其对应的版本信息可参考[此表](cts_refer.md) + # 如何使用 一些命令行支持的参数如下所示: @@ -93,12 +97,12 @@ Visit http://localhost:8000 for the report. ``` 整体上是一个 JSON数组,包含多条测试 case,每一个都是 JSON Object,`command`和`result`是一一对应的。除过上述示例中的字段,还有一些字段如下: -|name|value| 含义 | -|---|---|-----------------------------| -|tags|standalone,cluster| 只在tags指定的模式下才允许此case | -|skipped|true| 跳过此case | -|command_binary|true| 将命令转为二进制,例如命令中包含非可见的ascii字符 | -|sort_result|true| 对返回结果进行排序 | +| name | value | 含义 | +|----------------|--------------------|-----------------------------| +| tags | standalone,cluster | 只在tags指定的模式下才允许此case | +| skipped | true | 跳过此case | +| command_binary | true | 将命令转为二进制,例如命令中包含非可见的ascii字符 | +| sort_result | true | 对返回结果进行排序 | ### 使用别的编程语言使用此工具 本项目的主要工作是我们在 `cts.json`中增加了超过 7000 行测试,如果您希望用别的编程语言(例如 Java, Go, Rust等)实现相同功能的测试工具,那么您只需要解析 `cts.json` 的格式,并且将测试依次执行即可,玩的愉快。 diff --git a/README.md b/README.md index 0cd8344..ec17ce7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![4.0](https://github.com/tair-opensource/compatibility-test-suite-for-redis/actions/workflows/4.0.yaml/badge.svg)](https://github.com/tair-opensource/compatibility-test-suite-for-redis/actions/workflows/4.0.yaml) [![5.0](https://github.com/tair-opensource/compatibility-test-suite-for-redis/actions/workflows/5.0.yaml/badge.svg)](https://github.com/tair-opensource/compatibility-test-suite-for-redis/actions/workflows/5.0.yaml) [![6.0](https://github.com/tair-opensource/compatibility-test-suite-for-redis/actions/workflows/6.0.yaml/badge.svg)](https://github.com/tair-opensource/compatibility-test-suite-for-redis/actions/workflows/6.0.yaml) [![6.2](https://github.com/tair-opensource/compatibility-test-suite-for-redis/actions/workflows/6.2.yaml/badge.svg)](https://github.com/tair-opensource/compatibility-test-suite-for-redis/actions/workflows/6.2.yaml) [![7.0](https://github.com/tair-opensource/compatibility-test-suite-for-redis/actions/workflows/7.0.yaml/badge.svg)](https://github.com/tair-opensource/compatibility-test-suite-for-redis/actions/workflows/7.0.yaml) [![7.2](https://github.com/tair-opensource/compatibility-test-suite-for-redis/actions/workflows/7.2.yaml/badge.svg)](https://github.com/tair-opensource/compatibility-test-suite-for-redis/actions/workflows/7.2.yaml) [![unstable](https://github.com/tair-opensource/compatibility-test-suite-for-redis/actions/workflows/unstable.yaml/badge.svg)](https://github.com/tair-opensource/compatibility-test-suite-for-redis/actions/workflows/unstable.yaml) -compatibility-test-suite-for-redis is used to test whether your redis-like database is compatible with Redis versions (such as +compatibility-test-suite-for-redis(CTS) is used to test whether your redis-like database is compatible with Redis versions (such as 6.0, 7.0, etc.) [中文文档](README-CN.md) # Install @@ -13,6 +13,10 @@ requires `Python 3.7` or later. pip3 install -r requirements.txt ``` +# Testable Commands + +Refer to [this table](cts_refer.md) for the commands that CTS can test and their corresponding version information. + # How to use ``` @@ -71,7 +75,7 @@ connecting to 127.0.0.1:6379 using standalone client ... Visit http://localhost:8000 for the report. ``` -Then, an Http Server will be started on http://localhost:8000 by default, and you can access it to get reports. +Then, a Http Server will be started on http://localhost:8000 by default, and you can access it to get reports. ## More uses @@ -95,12 +99,12 @@ When you need to migrate the business system from A database to B, in order to p ``` Overall, it is a JSON array, containing multiple test cases, each of which is a JSON Object, and `command` and `result` are in one-to-one correspondence. In addition to the fields in the example, there are some as follows: -| name | value |meaning| -|---|-----------------------|---| -| tags | standalone or cluster |This case is only allowed in the mode specified by tags| -| skipped | true |skip this case| -| command_binary | true |Convert the command to binary, such as the command contains non-visible ascii characters| -| sort_result | true |Sort the returned results| +| name | value | meaning | +|----------------|-----------------------|------------------------------------------------------------------------------------------| +| tags | standalone or cluster | This case is only allowed in the mode specified by tags | +| skipped | true | skip this case | +| command_binary | true | Convert the command to binary, such as the command contains non-visible ascii characters | +| sort_result | true | Sort the returned results | ### Test with another programming language The main work of this project is that we have added more than 7000 lines of tests in `cts.json`, if you want to implement tests in other programming languages (such as Java, Go, Rust, etc.), then you only need to parse `cts.json ` format, and execute the tests sequentially, have fun. diff --git a/cts_refer.md b/cts_refer.md new file mode 100644 index 0000000..0db9a9d --- /dev/null +++ b/cts_refer.md @@ -0,0 +1,297 @@ +> 1. The table content consists of the commands supported by CTS (compatibility-test-suite-for-redis) and their version information +> 2. This table is generated based on the command JSON format description of Redis 7.2. If you have any doubts, you can refer to the relevant files +> 3. If the table information does not match the actual testing, please submit an Issue :) +- Supported major versions + - 1.0 + - 2.8 + - 3.2 + - 4.0 + - 5.0 + - 6.0 + - 6.2 + - 7.0 + - 7.2 + + +| **group** | **command** | | **Version 1.0** | **Version 2.8** | **Version 3.2** | **Version 4.0** | **Version 5.0** | **Version 6.0** | **Version 6.2** | **Version 7.0** | **Version 7.2** | +|-------------|-------------------------------------------------------|--------------------------------------------------------|-----------------|-----------------|-----------------|-----------------|-------------------------------------------------------------------------------------------------|-------------------------------------------|-----------------|--------------------------------------------------------|-----------------| +| **generic** | [del](https://redis.io/commands/del/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [unlink](https://redis.io/commands/unlink/) | | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [rename](https://redis.io/commands/rename/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [renamenx](https://redis.io/commands/renamenx/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [randomkey](https://redis.io/commands/randomkey/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [exists](https://redis.io/commands/exists/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [ttl](https://redis.io/commands/ttl/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [pttl](https://redis.io/commands/pttl/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [expire](https://redis.io/commands/expire/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ['7.0.0', 'Added options: `NX`, `XX`, `GT` and `LT`.'] | ✓ | +| | [expireat](https://redis.io/commands/expireat/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ['7.0.0', 'Added options: `NX`, `XX`, `GT` and `LT`.'] | ✓ | +| | [pexpire](https://redis.io/commands/pexpire/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ['7.0.0', 'Added options: `NX`, `XX`, `GT` and `LT`.'] | ✓ | +| | [pexpireat](https://redis.io/commands/pexpireat/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ['7.0.0', 'Added options: `NX`, `XX`, `GT` and `LT`.'] | ✓ | +| | [expiretime](https://redis.io/commands/expiretime/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | [pexpiretime](https://redis.io/commands/pexpiretime/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | [persist](https://redis.io/commands/persist/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [dump](https://redis.io/commands/dump/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [touch](https://redis.io/commands/touch/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [restore](https://redis.io/commands/restore/) | | ✗ | ✓ | ✓ | ✓ | ['5.0.0', 'Added the `ABSTTL` modifier.']/['5.0.0', 'Added the `IDLETIME` and `FREQ` options.'] | ✓ | ✓ | ✓ | ✓ | +| | [scan](https://redis.io/commands/scan/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ['6.0.0', 'Added the `TYPE` subcommand.'] | ✓ | ✓ | ✓ | +| | [keys](https://redis.io/commands/keys/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [move](https://redis.io/commands/move/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [copy](https://redis.io/commands/copy/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | +| | [type](https://redis.io/commands/type/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [wait](https://redis.io/commands/wait/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [sort](https://redis.io/commands/sort/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [sort_ro](https://redis.io/commands/sort_ro/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | [migrate](https://redis.io/commands/migrate/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ['6.0.0', 'Added the `AUTH2` option.'] | ✓ | ✓ | ✓ | +| | object | [freq](https://redis.io/commands/object-freq/) | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | | [refcount](https://redis.io/commands/object-refcount/) | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | | [idletime](https://redis.io/commands/object-idletime/) | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | | [encoding](https://redis.io/commands/object-encoding/) | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | + +| **group** | **command** | | **Version 1.0** | **Version 2.8** | **Version 3.2** | **Version 4.0** | **Version 5.0** | **Version 6.0** | **Version 6.2** | **Version 7.0** | **Version 7.2** | +|------------|---------------------------------------------------------|----------------------------------------------------------|-----------------|-----------------|-----------------|--------------------------------------------------------|-----------------|-----------------|-------------------------------------------------------|--------------------------------------------------------------------------------|-----------------------------------------------------------------------------| +| **server** | acl | [whoami](https://redis.io/commands/acl-whoami/) | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | +| | | [setuser](https://redis.io/commands/acl-setuser/) | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ['6.2.0', 'Added Pub/Sub channel patterns.'] | ['7.0.0', 'Added selectors and key based permissions.'] | ✓ | +| | | [deluser](https://redis.io/commands/acl-deluser/) | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | +| | | [users](https://redis.io/commands/acl-users/) | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | +| | | [log](https://redis.io/commands/acl-log/) | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ['7.2.0', 'Added entry ID, timestamp created, and timestamp last updated.'] | +| | | [dryrun](https://redis.io/commands/acl-dryrun/) | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | config | [get](https://redis.io/commands/config-get/) | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ['7.0.0', 'Added the ability to pass multiple pattern parameters in one call'] | ✓ | +| | | [set](https://redis.io/commands/config-set/) | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ['7.0.0', 'Added the ability to pass multiple pattern parameters in one call'] | ✓ | +| | | [resetstat](https://redis.io/commands/config-resetstat/) | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | module | [list](https://redis.io/commands/module-list/) | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [bgsave](https://redis.io/commands/bgsave/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [bgrewriteaof](https://redis.io/commands/bgrewriteaof/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [dbsize](https://redis.io/commands/dbsize/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [swapdb](https://redis.io/commands/swapdb/) | | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [slaveof](https://redis.io/commands/slaveof/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [flushall](https://redis.io/commands/flushall/) | | ✓ | ✓ | ✓ | ['4.0.0', 'Added the `ASYNC` flushing mode modifier.'] | ✓ | ✓ | ['6.2.0', 'Added the `SYNC` flushing mode modifier.'] | ✓ | ✓ | +| | [flushdb](https://redis.io/commands/flushdb/) | | ✓ | ✓ | ✓ | ['4.0.0', 'Added the `ASYNC` flushing mode modifier.'] | ✓ | ✓ | ['6.2.0', 'Added the `SYNC` flushing mode modifier.'] | ✓ | ✓ | +| | [replicaof](https://redis.io/commands/replicaof/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | + + +| **group** | **command** | | **Version 1.0** | **Version 2.8** | **Version 3.2** | **Version 4.0** | **Version 5.0** | **Version 6.0** | **Version 6.2** | **Version 7.0** | **Version 7.2** | +|------------|-------------------------------------------------------|-----|-----------------|-----------------|-----------------|-----------------|-----------------|------------------------------------------|---------------------------------------------------------|----------------------------------------------------------------------|-----------------| +| **string** | [set](https://redis.io/commands/set/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ['6.0.0', 'Added the `KEEPTTL` option.'] | ['6.2.0', 'Added the `GET`, `EXAT` and `PXAT` option.'] | ['7.0.0', 'Allowed the `NX` and `GET` options to be used together.'] | ✓ | +| | [setex](https://redis.io/commands/setex/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [setnx](https://redis.io/commands/setnx/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [psetex](https://redis.io/commands/psetex/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [append](https://redis.io/commands/append/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [get](https://redis.io/commands/get/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [getex](https://redis.io/commands/getex/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | +| | [getdel](https://redis.io/commands/getdel/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | +| | [substr](https://redis.io/commands/substr/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [strlen](https://redis.io/commands/strlen/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [getset](https://redis.io/commands/getset/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [setrange](https://redis.io/commands/setrange/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [getrange](https://redis.io/commands/getrange/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [incr](https://redis.io/commands/incr/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [decr](https://redis.io/commands/decr/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [incrby](https://redis.io/commands/incrby/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [decrby](https://redis.io/commands/decrby/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [incrbyfloat](https://redis.io/commands/incrbyfloat/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [mset](https://redis.io/commands/mset/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [msetnx](https://redis.io/commands/msetnx/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [mget](https://redis.io/commands/mget/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [lcs](https://redis.io/commands/lcs/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | + +| **group** | **command** | | **Version 1.0** | **Version 2.8** | **Version 3.2** | **Version 4.0** | **Version 5.0** | **Version 6.0** | **Version 6.2** | **Version 7.0** | **Version 7.2** | +|------------|-------------------------------------------------------|---|-----------------|-----------------|-----------------|-----------------|-----------------|-----------------|-----------------|---------------------------------------------|-----------------| +| **bitmap** | [setbit](https://redis.io/commands/setbit/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [getbit](https://redis.io/commands/getbit/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [bitop](https://redis.io/commands/bitop/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [bitpos](https://redis.io/commands/bitpos/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ['7.0.0', 'Added the `BYTE / BIT` option.'] | ✓ | +| | [bitcount](https://redis.io/commands/bitcount/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ['7.0.0', 'Added the `BYTE / BIT` option.'] | ✓ | +| | [bitfield](https://redis.io/commands/bitfield/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [bitfield_ro](https://redis.io/commands/bitfield_ro/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | + +| **group** | **command** | | **Version 1.0** | **Version 2.8** | **Version 3.2** | **Version 4.0** | **Version 5.0** | **Version 6.0** | **Version 6.2** | **Version 7.0** | **Version 7.2** | +|-----------------|-----------------------------------------------|---|-----------------|-----------------|-----------------|-----------------|-----------------|-----------------|-----------------|-----------------|-----------------| +| **transaction** | [discard](https://redis.io/commands/discard/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [exec](https://redis.io/commands/exec/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [multi](https://redis.io/commands/multi/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [unwatch](https://redis.io/commands/unwatch/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [watch](https://redis.io/commands/watch/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | + +| **group** | **command** | | **Version 1.0** | **Version 2.8** | **Version 3.2** | **Version 4.0** | **Version 5.0** | **Version 6.0** | **Version 6.2** | **Version 7.0** | **Version 7.2** | +|-------------|-----------------------------------------------------------|---|-----------------|-----------------|-----------------|-----------------|-----------------|-----------------|-----------------|-----------------|-----------------| +| hyperloglog | [pfadd](https://redis.io/commands/pfadd/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [pfcount](https://redis.io/commands/pfcount/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [pfmerge](https://redis.io/commands/pfmerge/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [pfdebug](https://redis.io/commands/pfdebug/) [不支持] | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [pfselftest](https://redis.io/commands/pfselftest/) [不支持] | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | + + + +| **group** | **command** | | **Version 1.0** | **Version 2.8** | **Version 3.2** | **Version 4.0** | **Version 5.0** | **Version 6.0** | **Version 6.2** | **Version 7.0** | **Version 7.2** | +|-----------|-----------------------------------------------------|---|-----------------|-----------------|-----------------|----------------------------------------------------|-----------------|--------------------------------------------------------------------------|------------------------------------------|-----------------|-----------------| +| **list** | [lset](https://redis.io/commands/lset/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [llen](https://redis.io/commands/llen/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [lpush](https://redis.io/commands/lpush/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [lpushx](https://redis.io/commands/lpushx/) | | ✗ | ✓ | ✓ | ['4.0.0', 'Accepts multiple `element` arguments.'] | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [lindex](https://redis.io/commands/lindex/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [lpos](https://redis.io/commands/lpos/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | +| | [lrem](https://redis.io/commands/lrem/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [lrange](https://redis.io/commands/lrange/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [rpush](https://redis.io/commands/rpush/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [ltrim](https://redis.io/commands/ltrim/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [linsert](https://redis.io/commands/linsert/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [rpushx](https://redis.io/commands/rpushx/) | | ✗ | ✗ | ✗ | ['4.0.0', 'Accepts multiple `element` arguments.'] | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [rpoplpush](https://redis.io/commands/rpoplpush/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [lmove](https://redis.io/commands/lmove/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | +| | [lmpop](https://redis.io/commands/lmpop/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | [rpop](https://redis.io/commands/rpop/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ['6.2.0', 'Added the `count` argument.'] | ✓ | ✓ | +| | [lpop](https://redis.io/commands/lpop/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ['6.2.0', 'Added the `count` argument.'] | ✓ | ✓ | +| | [brpop](https://redis.io/commands/brpop/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ['6.0.0', '`timeout` is interpreted as a double instead of an integer.'] | ✓ | ✓ | ✓ | +| | [blpop](https://redis.io/commands/blpop/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ['6.0.0', '`timeout` is interpreted as a double instead of an integer.'] | ✓ | ✓ | ✓ | +| | [brpoplpush](https://redis.io/commands/brpoplpush/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ['6.0.0', '`timeout` is interpreted as a double instead of an integer.'] | ✓ | ✓ | ✓ | +| | [blmove](https://redis.io/commands/blmove/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | +| | [blmpop](https://redis.io/commands/blmpop/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | + +| **group** | **command** | | **Version 1.0** | **Version 2.8** | **Version 3.2** | **Version 4.0** | **Version 5.0** | **Version 6.0** | **Version 6.2** | **Version 7.0** | **Version 7.2** | +|-----------|---------------------------------------------------------|---|-----------------|-----------------|-----------------|--------------------------------------------------------------|-----------------|-----------------|-----------------|-----------------|-----------------| +| **hash** | [hset](https://redis.io/commands/hset/) | | ✗ | ✓ | ✓ | ['4.0.0', 'Accepts multiple `field` and `value` arguments.'] | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [hsetnx](https://redis.io/commands/hsetnx/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [hget](https://redis.io/commands/hget/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [hstrlen](https://redis.io/commands/hstrlen/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [hexists](https://redis.io/commands/hexists/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [hlen](https://redis.io/commands/hlen/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [hkeys](https://redis.io/commands/hkeys/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [hvals](https://redis.io/commands/hvals/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [hgetall](https://redis.io/commands/hgetall/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [hincrby](https://redis.io/commands/hincrby/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [hincrbyfloat](https://redis.io/commands/hincrbyfloat/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [hscan](https://redis.io/commands/hscan/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [hrandfield](https://redis.io/commands/hrandfield/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | +| | [hdel](https://redis.io/commands/hdel/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [hmset](https://redis.io/commands/hmset/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [hmget](https://redis.io/commands/hmget/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | + +| **group** | **command** | | **Version 1.0** | **Version 2.8** | **Version 3.2** | **Version 4.0** | **Version 5.0** | **Version 6.0** | **Version 6.2** | **Version 7.0** | **Version 7.2** | +|-----------|-------------------------------------------------------|---|-----------------|-----------------|------------------------------------------|-----------------|-----------------|-----------------|-----------------|-----------------|-----------------| +| **set** | [sadd](https://redis.io/commands/sadd/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [srem](https://redis.io/commands/srem/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [sscan](https://redis.io/commands/sscan/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [scard](https://redis.io/commands/scard/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [spop](https://redis.io/commands/spop/) | | ✓ | ✓ | ['3.2.0', 'Added the `count` argument.'] | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [srandmember](https://redis.io/commands/srandmember/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [smembers](https://redis.io/commands/smembers/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | +| | [sismember](https://redis.io/commands/sismember/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [smismember](https://redis.io/commands/smismember/) | | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [sdiffstore](https://redis.io/commands/sdiffstore/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [sinterstore](https://redis.io/commands/sinterstore/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [sunionstore](https://redis.io/commands/sunionstore/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [sdiff](https://redis.io/commands/sdiff/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [sinter](https://redis.io/commands/sinter/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [sunion](https://redis.io/commands/sunion/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [smove](https://redis.io/commands/smove/) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [sintercard](https://redis.io/commands/sintercard/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | + +| **group** | **command** | | **Version 1.0** | **Version 2.8** | **Version 3.2** | **Version 4.0** | **Version 5.0** | **Version 6.0** | **Version 6.2** | **Version 7.0** | **Version 7.2** | +|----------------|-----------------------------------------------------------------|---|-----------------|-----------------|-----------------|-----------------|-----------------|--------------------------------------------------------------------------|-----------------------------------------------------------------------|-----------------|-------------------------------------------------------| +| **sorted set** | [zadd](https://redis.io/commands/zadd/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ['6.2.0', 'Added the `GT` and `LT` options.'] | ✓ | ✓ | +| | [zrem](https://redis.io/commands/zrem/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zcard](https://redis.io/commands/zcard/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zrank](https://redis.io/commands/zrank/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ['7.2.0', 'Added the optional `WITHSCORE` argument.'] | +| | [zrevrank](https://redis.io/commands/zrevrank/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ['7.2.0', 'Added the optional `WITHSCORE` argument.'] | +| | [zcount](https://redis.io/commands/zcount/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zincrby](https://redis.io/commands/zincrby/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zscan](https://redis.io/commands/zscan/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zrandmember](https://redis.io/commands/zrandmember/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | +| | [zremrangebylex](https://redis.io/commands/zremrangebylex/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zremrangebyscore](https://redis.io/commands/zremrangebyscore/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zremrangebyrank](https://redis.io/commands/zremrangebyrank/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zlexcount](https://redis.io/commands/zlexcount/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zrangebylex](https://redis.io/commands/zrangebylex/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zrevrangebylex](https://redis.io/commands/zrevrangebylex/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zrangebyscore](https://redis.io/commands/zrangebyscore/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zrevrangebyscore](https://redis.io/commands/zrevrangebyscore/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zscore](https://redis.io/commands/zscore/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zmscore](https://redis.io/commands/zmscore/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | +| | [zpopmax](https://redis.io/commands/zpopmax/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zpopmin](https://redis.io/commands/zpopmin/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zmpop](https://redis.io/commands/zmpop/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | [bzmpop](https://redis.io/commands/bzmpop/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | [zintercard](https://redis.io/commands/zintercard/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | [bzpopmin](https://redis.io/commands/bzpopmin/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ['6.0.0', '`timeout` is interpreted as a double instead of an integer.'] | ✓ | ✓ | ✓ | +| | [bzpopmax](https://redis.io/commands/bzpopmax/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ['6.0.0', '`timeout` is interpreted as a double instead of an integer.'] | ✓ | ✓ | ✓ | +| | [zdiffstore](https://redis.io/commands/zdiffstore/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | +| | [zinterstore](https://redis.io/commands/zinterstore/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zunionstore](https://redis.io/commands/zunionstore/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [zrangestore](https://redis.io/commands/zrangestore/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | +| | [zdiff](https://redis.io/commands/zdiff/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | +| | [zinter](https://redis.io/commands/zinter/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | +| | [zunion](https://redis.io/commands/zunion/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | +| | [zrange](https://redis.io/commands/zrange/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ['6.2.0', 'Added the `REV`, `BYSCORE`, `BYLEX` and `LIMIT` options.'] | ✓ | ✓ | +| | [zrevrange](https://redis.io/commands/zrevrange/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | + +| **group** | **command** | | **Version 1.0** | **Version 2.8** | **Version 3.2** | **Version 4.0** | **Version 5.0** | **Version 6.0** | **Version 6.2** | **Version 7.0** | **Version 7.2** | +|-----------|-------------------------------------------------------------------------|---|-----------------|-----------------|-----------------|-----------------|-----------------|-----------------|-----------------------------------------------------|------------------------------------------------------|-----------------| +| **geo** | [geoadd](https://redis.io/commands/geoadd/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ['6.2.0', 'Added the `CH`, `NX` and `XX` options.'] | ✓ | ✓ | +| | [geohash](https://redis.io/commands/geohash/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [geodist](https://redis.io/commands/geodist/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [geopos](https://redis.io/commands/geopos/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [georadius](https://redis.io/commands/georadius/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ['6.2.0', 'Added the `ANY` option for `COUNT`.'] | ['7.0.0', 'Added support for uppercase unit names.'] | ✓ | +| | [georadius_ro](https://redis.io/commands/georadius_ro/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ['6.2.0', 'Added the `ANY` option for `COUNT`.'] | ✓ | ✓ | +| | [georadiusbymember](https://redis.io/commands/georadiusbymember/) | | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ['7.0.0', 'Added support for uppercase unit names.'] | ✓ | +| | [georadiusbymember_ro](https://redis.io/commands/georadiusbymember_ro/) | | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [geosearch](https://redis.io/commands/geosearch/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ['7.0.0', 'Added support for uppercase unit names.'] | ✓ | +| | [geosearchstore](https://redis.io/commands/geosearchstore/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ['7.0.0', 'Added support for uppercase unit names.'] | ✓ | + +| **group** | **command** | | **Version 1.0** | **Version 2.8** | **Version 3.2** | **Version 4.0** | **Version 5.0** | **Version 6.0** | **Version 6.2** | **Version 7.0** | **Version 7.2** | +|------------|-----------------------------------------------------|--------------------------------------------------------------------|-----------------|-----------------|-----------------|-----------------|-----------------|-----------------------------------------|-----------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| +| **stream** | [xadd](https://redis.io/commands/xadd/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ['6.2.0', 'Added the `NOMKSTREAM` option, `MINID` trimming strategy and the `LIMIT` option.'] | ['7.0.0', 'Added support for the `-*` explicit ID form.'] | ✓ | +| | [xdel](https://redis.io/commands/xdel/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [xack](https://redis.io/commands/xack/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [xclaim](https://redis.io/commands/xclaim/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [xlen](https://redis.io/commands/xlen/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [xtrim](https://redis.io/commands/xtrim/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ['6.2.0', 'Added the `MINID` trimming strategy and the `LIMIT` option.'] | ✓ | ✓ | +| | [xread](https://redis.io/commands/xread/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [xreadgroup](https://redis.io/commands/xreadgroup/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [xrange](https://redis.io/commands/xrange/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ['6.2.0', 'Added exclusive ranges.'] | ✓ | ✓ | +| | [xrevrange](https://redis.io/commands/xrevrange/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ['6.2.0', 'Added exclusive ranges.'] | ✓ | ✓ | +| | [xsetid](https://redis.io/commands/xsetid/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ['7.0.0', 'Added the `entries_added` and `max_deleted_entry_id` arguments.'] | ✓ | +| | [xpending](https://redis.io/commands/xpending/) | | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ['6.2.0', 'Added the `IDLE` option and exclusive range intervals.'] | ✓ | ✓ | +| | [xautoclaim](https://redis.io/commands/xautoclaim/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ['7.0.0', 'Added an element to the reply array, containing deleted entries the command cleared from the PEL'] | ✓ | +| | xgroup | [createconsumer](https://redis.io/commands/xgroup-createconsumer/) | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | +| | | [delconsumer](https://redis.io/commands/xgroup-delconsumer/) | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | | [create](https://redis.io/commands/xgroup-create/) | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ['7.0.0', 'Added the `entries_read` named argument.'] | ✓ | +| | | [destroy](https://redis.io/commands/xgroup-destroy/) | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | | [setid](https://redis.io/commands/xgroup-setid/) | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ['7.0.0', 'Added the optional `entries_read` argument.'] | ✓ | +| | xinfo | [groups](https://redis.io/commands/xinfo-groups/) | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ['7.0.0', 'Added the `entries-read` and `lag` fields'] | ✓ | +| | | [consumers](https://redis.io/commands/xinfo-consumers/) | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ['7.2.0', 'Added the `inactive` field.'] | +| | | [stream](https://redis.io/commands/xinfo-stream/) | ✗ | ✗ | ✗ | ✗ | ✓ | ['6.0.0', 'Added the `FULL` modifier.'] | ✓ | ['7.0.0', 'Added the `max-deleted-entry-id`, `entries-added`, `recorded-first-entry-id`, `entries-read` and `lag` fields'] | ['7.2.0', 'Added the `active-time` field, and changed the meaning of `seen-time`.'] | + + +| **group** | **command** | | **Version 1.0** | **Version 2.8** | **Version 3.2** | **Version 4.0** | **Version 5.0** | **Version 6.0** | **Version 6.2** | **Version 7.0** | **Version 7.2** | +|-----------|-----------------------------------------------------|--------------------------------------------------------|-----------------|-----------------|-----------------|-----------------|-----------------|-----------------|--------------------------------------------------------------------|-----------------|-----------------| +| scripting | [eval](https://redis.io/commands/eval/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [evalsha](https://redis.io/commands/evalsha/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [eval_ro](https://redis.io/commands/eval_ro/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | [evalsha_ro](https://redis.io/commands/evalsha_ro/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | script | [load](https://redis.io/commands/script-load/) | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | | [exists](https://redis.io/commands/script-exists/) | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | | [flush](https://redis.io/commands/script-flush/) | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ['6.2.0', 'Added the `ASYNC` and `SYNC` flushing mode modifiers.'] | ✓ | ✓ | +| | | [debug](https://redis.io/commands/script-debug/) | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [fcall](https://redis.io/commands/fcall/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | [fcall_ro](https://redis.io/commands/fcall_ro/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | function | [stats](https://redis.io/commands/function-stats/) | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | | [list](https://redis.io/commands/function-list/) | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | | [dump](https://redis.io/commands/function-dump/) | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | | [restore](https://redis.io/commands/function-restore/) | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | | [flush](https://redis.io/commands/function-flush/) | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | | [delete](https://redis.io/commands/function-delete/) | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | + +| **group** | **command** | | **Version 1.0** | **Version 2.8** | **Version 3.2** | **Version 4.0** | **Version 5.0** | **Version 6.0** | **Version 6.2** | **Version 7.0** | **Version 7.2** | +|------------|:-------------------------------------------------------:|------------------------------------------------------------------|-----------------|-----------------|-----------------|-----------------|-----------------|-----------------|--------------------------------------------------------------|-----------------|-----------------| +| **pubsub** | [publish](https://redis.io/commands/publish/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [subscribe](https://redis.io/commands/subscribe/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ['6.2.0', '`RESET` can be called to exit subscribed state.'] | ✓ | ✓ | +| | [unsubscribe](https://redis.io/commands/unsubscribe/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | [punsubscribe](https://redis.io/commands/punsubscribe/) | | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ['6.2.0', '`RESET` can be called to exit subscribed state.'] | ✓ | ✓ | +| | [spublish](https://redis.io/commands/spublish/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | [ssubscribe](https://redis.io/commands/ssubscribe/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | [sunsubscribe](https://redis.io/commands/sunsubscribe/) | | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | pubsub | [numsub](https://redis.io/commands/pubsub-numsub/) | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | | [numpat](https://redis.io/commands/pubsub-numpat/) | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | | [channels](https://redis.io/commands/pubsub-channels/) | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| | | [shardnumsub](https://redis.io/commands/pubsub-shardnumsub/) | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | +| | | [shardchannels](https://redis.io/commands/pubsub-shardchannels/) | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ | \ No newline at end of file