集群架构与读写分离架构实例的命令限制

相对标准架构,集群架构与读写分离架构的云数据库 Tair(兼容 Redis)实例在Redis命令的支持上有一定的区别,例如禁用某些命令、单个命令不支持访问跨Slot的Key等,请在使用过程中了解并遵守相应的规范。

集群架构命令限制

集群架构实例本身兼容不同的Redis版本,各版本整体的命令支持情况请参见Redis开源版命令支持Tair命令支持

集群架构支持直连模式与代理模式,其命令限制有所不同:

集群架构直连模式

  • 由于主流客户端(例如Jedis客户端)的自身限制,不支持SELECT命令。

  • 仅兼容Redis 7.0版的集群架构实例支持SWAPDB命令。

  • 如需执行涉及多Key的命令,请确保命令操作的Key都分布在同一个Slot中,例如使用Hash tag等。

  • 在集群架构直连模式中执行事务时,要求与开源Redis Cluster行为一致,即严格要求事务所操作的Key均在同一Slot。

集群架构代理模式

  • 在集群架构直连模式的基础上,代理节点额外不支持WAITHELLOCLIENT ID等命令,但支持SELECT命令,也支持对如下命令执行跨Slot的多Key操作:DELEXISTS等,详细介绍请参见代理模式(Proxy)支持的命令列表

  • CLIENT KILL命令目前支持的格式为:CLIENT KILL <ip:port>CLIENT KILL ADDR <ip:port>

  • 执行CLIENT LIST命令会列出所有连接到该代理节点的连接信息,返回结果与Redis原生命令有所不同,说明如下:

    • idageidleaddrfdnamedbmultiomemcmd字段和原生Redis的含义一致。

    • subpsub在代理节点上没有区分,统一为1或0。

    • qbufqbuf-freeobloll字段目前没有具体意义。

  • 关于事务的限制:

    • 当事务内所有的Key都在同一个Slot时,事务可以正常执行,且遵循事务语意。

    • 当不满足事务内所有的Key都在同一个Slot,但满足每个命令内部的Key都在同一个Slot时,事务可以正常执行,属于同一个Slot的命令之间遵循事务语意,属于不同Slot的命令之间不保证事务语意。

    • 当事务不满足同一个命令内的Key都属于同一个Slot时,命令无法执行。

    • 部分没有Key的命令不支持在事务中执行,详情查看代理模式(Proxy)支持的命令列表。

  • 为便于日常管理和运维,集群架构代理模式实例支持多个自研的命令,更多信息请参见阿里云自研的Proxy命令

除此之外,Redis Cluster对使用Lua脚本增加了一些限制,云数据库 Tair(兼容 Redis)集群架构在此基础上存在额外限制,更多信息请参见集群中Lua脚本的限制

读写分离架构命令限制

读写分离架构实例兼容不同的Redis版本,各版本整体的命令支持情况请参见Redis开源版命令支持Tair命令支持

  • 由于读写分离架构默认为代理模式,读写分离架构存在代理节点的命令限制,例如代理节点不支持WAITHELLOCLIENT ID等命令,详细介绍请参见代理模式(Proxy)支持的命令列表

  • 为便于日常管理和运维,读写分离架构实例支持多个自研的命令,更多信息请参见阿里云自研的Proxy命令

代理模式(Proxy)支持的命令列表

以下内容适用于集群架构代理模式和读写分离架构,为便于浏览和内容表达,本文的表格约定使用下述注释:

  • ✔️表示Proxy支持该命令,若该命令支持多Key,则表示支持跨Slot执行该命令。

  • ⭕️表示Proxy支持该命令,但存在限制,请确保命令所要操作的Key都分布在1个Slot中,例如使用Hash tag等。

  • ❌表示Proxy不支持该命令。

  • 数字标记①:为兼容某些客户端框架,该命令仅返回OK或空结果,不会真正执行。

  • 数字标记②:该请求由Proxy直接处理返回,不受Redis DB版本限制。

Bitmap

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

BITCOUNT

✔️

✔️

✔️

✔️

BITFIELD

✔️

✔️

✔️

✔️

BITFIELD_RO

BITOP

⭕️

⭕️

✔️

✔️

BITPOS

✔️

✔️

✔️

✔️

GETBIT

✔️

✔️

✔️

✔️

SETBIT

✔️

✔️

✔️

✔️

Cluster management

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

CLUSTER ADDSLOTS ①②

✔️

✔️

CLUSTER ADDSLOTSRANGE

CLUSTER BUMPEPOCH

CLUSTER COUNT-FAILURE-REPORTS ②

✔️

✔️

CLUSTER COUNTKEYSINSLOT ②

✔️

✔️

CLUSTER DELSLOTS ①②

✔️

✔️

CLUSTER DELSLOTSRANGE

CLUSTER FAILOVER ①②

✔️

✔️

CLUSTER FLUSHSLOTS

CLUSTER FORGET ①②

✔️

✔️

CLUSTER GETKEYSINSLOT ①②

✔️

✔️

CLUSTER INFO ②

✔️

✔️

CLUSTER KEYSLOT ②

✔️

✔️

CLUSTER LINKS

CLUSTER MEET ①②

✔️

✔️

CLUSTER MYID

CLUSTER NODES ②

✔️

✔️

CLUSTER REPLICAS

CLUSTER REPLICATE ①②

✔️

✔️

CLUSTER RESET ①②

✔️

✔️

CLUSTER SAVECONFIG ①②

✔️

✔️

CLUSTER SET-CONFIG-EPOCH ①②

✔️

✔️

CLUSTER SETSLOT ①②

✔️

✔️

CLUSTER SHARDS

CLUSTER SLAVES ②

✔️

✔️

CLUSTER SLOTS ②

✔️

✔️

READONLY ①②

✔️

✔️️

READWRITE ①②

✔️

✔️

Connection management

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

AUTH

✔️

✔️

✔️

CLIENT CACHING

CLIENT GETNAME ②

✔️

✔️

CLIENT GETREDIR

CLIENT ID

CLIENT INFO

CLIENT KILL ②

✔️

✔️

CLIENT LIST ②

✔️

✔️

CLIENT NO-EVICT

CLIENT PAUSE

CLIENT REPLY

CLIENT SETNAME ②

✔️

✔️

CLIENT TRACKING

CLIENT TRACKINGINFO

CLIENT UNBLOCK

CLIENT UNPAUSE

ECHO

✔️

✔️

✔️

HELLO

PING ②

✔️

✔️

✔️

QUIT ②

✔️

✔️

✔️

✔️

RESET

SELECT

✔️

✔️

✔️

✔️

Generic

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

COPY

⭕️

⭕️

✔️

✔️

DEL

✔️

⭕️

✔️

✔️

DUMP

✔️

✔️

✔️

✔️

EXISTS

✔️

⭕️

✔️

✔️

EXPIRE

✔️

✔️

✔️

✔️

EXPIREAT

✔️

✔️

✔️

✔️

EXPIRETIME

✔️

✔️

✔️

✔️

KEYS

✔️

✔️

✔️

MIGRATE

MOVE

✔️

✔️

✔️

✔️

OBJECT

✔️

✔️

✔️

✔️

OBJECT HELP

✔️

✔️

✔️

✔️

PERSIST

✔️

✔️

✔️

✔️

PEXPIRE

✔️

✔️

✔️

✔️

PEXPIREAT

✔️

✔️

✔️

✔️

PEXPIRETIME

✔️

✔️

✔️

✔️

PTTL

✔️

✔️

✔️

✔️

RANDOMKEY

✔️

✔️

✔️

RENAME

⭕️

⭕️

✔️

✔️

RENAMENX

⭕️

⭕️

✔️

✔️

RESTORE

✔️

✔️

✔️

✔️

SCAN

✔️

✔️

✔️

SORT

⭕️

⭕️

✔️

✔️

SORT_RO

✔️

✔️

✔️

✔️

TOUCH

TTL

✔️

✔️

✔️

✔️

TYPE

✔️

✔️

✔️

✔️

UNLINK

✔️

⭕️

✔️

✔️

WAIT

Geospatial indices

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

GEOADD

✔️

✔️

✔️

✔️

GEODIST

✔️

✔️

✔️

✔️

GEOHASH

✔️

✔️

✔️

✔️

GEOPOS

✔️

✔️

✔️

✔️

GEORADIUS

⭕️

⭕️

✔️

✔️

GEORADIUSBYMEMBER

⭕️

⭕️

✔️

✔️

GEOSEARCH

✔️

✔️

✔️

✔️

GEOSEARCHSTORE

⭕️

⭕️

✔️

✔️

Hash

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

HDEL

✔️

✔️

✔️

✔️

HEXISTS

✔️

✔️

✔️

✔️

HGET

✔️

✔️

✔️

✔️

HGETALL

✔️

✔️

✔️

✔️

HINCRBY

✔️

✔️

✔️

✔️

HINCRBYFLOAT

✔️

✔️

✔️

✔️

HKEYS

✔️

✔️

✔️

✔️

HLEN

✔️

✔️

✔️

✔️

HMGET

✔️

✔️

✔️

✔️

HMSET

✔️

✔️

✔️

✔️

HRANDFIELD

✔️

✔️

✔️

✔️

HSCAN

✔️

✔️

✔️

✔️

HSET

✔️

✔️

✔️

✔️

HSETNX

✔️

✔️

✔️

✔️

HSTRLEN

✔️

✔️

✔️

✔️

HVALS

✔️

✔️

✔️

✔️

HyperLogLog

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

PFADD

✔️

✔️

✔️

✔️

PFCOUNT

⭕️

⭕️

✔️

✔️

PFMERGE

⭕️

⭕️

✔️

✔️

Lists

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

BLPOP

⭕️

⭕️

✔️

✔️

BLMOVE

⭕️

⭕️

✔️

✔️

BLMPOP

⭕️

⭕️

✔️

✔️

BRPOP

⭕️

⭕️

✔️

✔️

BRPOPLPUSH

⭕️

⭕️

✔️

✔️

LINDEX

✔️

✔️

✔️

✔️

LINSERT

✔️

✔️

✔️

✔️

LLEN

✔️

✔️

✔️

✔️

LMOVE

⭕️

⭕️

✔️

✔️

LMPOP

⭕️

⭕️

✔️

✔️

LPOP

✔️

✔️

✔️

✔️

LPUSH

✔️

✔️

✔️

✔️

LPUSHX

✔️

✔️

✔️

✔️

LRANGE

✔️

✔️

✔️

✔️

LREM

✔️

✔️

✔️

✔️

LSET

✔️

✔️

✔️

✔️

LTRIM

✔️

✔️

✔️

✔️

RPOP

✔️

✔️

✔️

✔️

RPOPLPUSH

⭕️

⭕️

✔️

✔️

RPUSH

✔️

✔️

✔️

✔️

RPUSHX

✔️

✔️

✔️

✔️

Pub/Sub

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

PSUBSCRIBE

✔️

✔️

PUBLISH

✔️

✔️

✔️

✔️

PUBSUB

✔️

✔️

✔️

PUBSUB HELP

PUBSUB SHARDCHANNELS

✔️

✔️

✔️

PUBSUB SHARDNUMSUB

✔️

✔️

✔️

PUNSUBSCRIBE

✔️

✔️

SPUBLISH

✔️

✔️

✔️

✔️

SUBSCRIBE

✔️

✔️

SSUBSCRIBE

✔️

✔️

SUNSUBSCRIBE

✔️

✔️

UNSUBSCRIBE

✔️

✔️

Scripting and Functions

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

EVAL

⭕️

✔️

✔️

EVAL_RO

⭕️

✔️

✔️

EVALSHA

⭕️

✔️

✔️

EVALSHA_RO

⭕️

✔️

✔️

FCALL

⭕️

✔️

✔️

FCALL_RO

⭕️

✔️

✔️

FUNCTION DELETE

✔️

✔️

FUNCTION DUMP

✔️

✔️

FUNCTION FLUSH

✔️

✔️

FUNCTION HELP

✔️

✔️

FUNCTION KILL

✔️

✔️

FUNCTION LIST

✔️

✔️

FUNCTION LOAD

✔️

✔️

FUNCTION RESTORE

✔️

✔️

FUNCTION STATS

✔️

✔️

SCRIPT DEBUG

SCRIPT EXISTS

✔️

✔️

SCRIPT FLUSH

✔️

✔️

SCRIPT KILL

✔️

✔️

SCRIPT LOAD

✔️

✔️

Server management

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

ACL CAT

ACL DELUSER

ACL DRYRUN

ACL GENPASS

ACL GETUSER

ACL HELP

ACL LIST

ACL LOAD

ACL LOG

ACL SAVE

ACL SETUSER

ACL USERS

ACL WHOAMI

BGREWRITEAOF

BGSAVE

COMMAND

✔️

✔️

✔️

COMMAND COUNT

✔️

✔️

✔️

COMMAND DOCS

✔️

✔️

✔️

COMMAND GETKEYS

✔️

✔️

✔️

COMMAND GETKEYSANDFLAGS

✔️

✔️

✔️

COMMAND INFO

✔️

✔️

✔️

COMMAND LIST

✔️

✔️

✔️

CONFIG GET

✔️

✔️

✔️

CONFIG HELP

CONFIG RESETSTAT

CONFIG REWRITE

CONFIG SET ①②

✔️

✔️

✔️

DBSIZE

✔️

✔️

✔️

DEBUG OBJECT

DEBUG SEGFAULT

FAILOVER

FLUSHALL

✔️

✔️

✔️

FLUSHDB

✔️

✔️

✔️

INFO

✔️

✔️

✔️

LASTSAVE

LATENCY DOCTOR

LATENCY GRAPH

LATENCY HELP

LATENCY HISTOGRAM

LATENCY HISTORY

LATENCY LATEST

LATENCY RESET

LOLWUT

✔️

✔️

✔️

MEMORY DOCTOR

✔️

✔️

MEMORY HELP

✔️

✔️

MEMORY MALLOC-STATS

✔️

✔️

MEMORY PURGE

✔️

✔️

MEMORY STATS

✔️

✔️

MEMORY USAGE

✔️

✔️

MODULE LIST

MODULE LOAD

MODULE LOADEX

MODULE UNLOAD

MONITOR

✔️

✔️

PSYNC

REPLICAOF

ROLE ②

✔️

✔️

SAVE

SHUTDOWN

SLAVEOF

SLOWLOG

✔️

✔️

✔️

SLOWLOG HELP

✔️

✔️

✔️

SLOWLOG RESET

✔️

✔️

✔️

SWAPDB

✔️

✔️

✔️

SYNC

TIME

✔️

✔️

✔️

Sentinel

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

SENTINEL sentinels ②

✔️

✔️

SENTINEL get-master-addr-by-name ②

✔️

✔️

Set

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

SADD

✔️

✔️

✔️

✔️

SCARD

✔️

✔️

✔️

✔️

SDIFF

✔️

⭕️

✔️

✔️

SDIFFSTORE

✔️

⭕️

✔️

✔️

SINTER

✔️

⭕️

✔️

✔️

SINTERCARD

✔️

⭕️

✔️

✔️

SINTERSTORE

✔️

⭕️

✔️

✔️

SISMEMBER

✔️

✔️

✔️

✔️

SMEMBERS

✔️

✔️

✔️

✔️

SMISMEMBER

✔️

✔️

✔️

✔️

SMOVE

✔️

⭕️

✔️

✔️

SPOP

✔️

✔️

✔️

✔️

SRANDMEMBER

✔️

✔️

✔️

✔️

SREM

✔️

✔️

✔️

✔️

SSCAN

✔️

✔️

✔️

✔️

SUNION

✔️

⭕️

✔️

✔️

SUNIONSTORE

✔️

⭕️

✔️

✔️

Sorted Set

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

BZMPOP

⭕️

⭕️

✔️

✔️

BZPOPMAX

⭕️

⭕️

✔️

✔️

BZPOPMIN

⭕️

⭕️

✔️

✔️

ZADD

✔️

✔️

✔️

✔️

ZCARD

✔️

✔️

✔️

✔️

ZCOUNT

✔️

✔️

✔️

✔️

ZDIFF

✔️

⭕️

✔️

✔️

ZDIFFSTORE

✔️

⭕️

✔️

✔️

ZINCRBY

✔️

✔️

✔️

✔️

ZINTER

✔️

✔️

✔️

✔️

ZINTERCARD

✔️

⭕️

✔️

✔️

ZINTERSTORE

✔️

⭕️

✔️

✔️

ZLEXCOUNT

✔️

✔️

✔️

✔️

ZMPOP

⭕️

⭕️

✔️

✔️

ZMSCORE

✔️

✔️

✔️

✔️

ZPOPMAX

✔️

✔️

✔️

✔️

ZPOPMIN

✔️

✔️

✔️

✔️

ZRANDMEMBER

✔️

✔️

✔️

✔️

ZRANGE

✔️

✔️

✔️

✔️

ZRANGEBYLEX

✔️

✔️

✔️

✔️

ZRANGEBYSCORE

✔️

✔️

✔️

✔️

ZRANGESTORE

⭕️

⭕️

✔️

✔️

ZRANK

✔️

✔️

✔️

✔️

ZREM

✔️

✔️

✔️

✔️

ZREMRANGEBYLEX

✔️

✔️

✔️

✔️

ZREMRANGEBYRANK

✔️

✔️

✔️

✔️

ZREMRANGEBYSCORE

✔️

✔️

✔️

✔️

ZREVRANGE

✔️

✔️

✔️

✔️

ZREVRANGEBYLEX

✔️

✔️

✔️

✔️

ZREVRANGEBYSCORE

✔️

✔️

✔️

✔️

ZREVRANK

✔️

✔️

✔️

✔️

ZSCAN

✔️

✔️

✔️

✔️

ZSCORE

✔️

✔️

✔️

✔️

ZUNION

✔️

⭕️

✔️

✔️

ZUNIONSTORE

✔️

⭕️

✔️

✔️

Stream

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

XACK

✔️

✔️

✔️

✔️

XADD

✔️

✔️

✔️

✔️

XAUTOCLAIM

✔️

✔️

✔️

✔️

XCLAIM

✔️

✔️

✔️

✔️

XDEL

✔️

✔️

✔️

✔️

XGROUP

✔️

✔️

✔️

✔️

XGROUP CREATECONSUMER

✔️

✔️

✔️

✔️

XINFO

✔️

✔️

✔️

✔️

XLEN

✔️

✔️

✔️

✔️

XPENDING

✔️

✔️

✔️

✔️

XRANGE

✔️

✔️

✔️

✔️

XREAD

⭕️

⭕️

✔️

✔️

XREADGROUP

⭕️

⭕️

✔️

✔️

XREVRANGE

✔️

✔️

✔️

✔️

XTRIM

✔️

✔️

✔️

✔️

String

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

APPEND

✔️

✔️

✔️

✔️

DECR

✔️

✔️

✔️

✔️

DECRBY

✔️

✔️

✔️

✔️

GET

✔️

✔️

✔️

✔️

GETDEL

✔️

✔️

✔️

✔️

GETEX

✔️

✔️

✔️

✔️

GETRANGE

✔️

✔️

✔️

✔️

GETSET

✔️

✔️

✔️

✔️

LCS

✔️

⭕️

✔️

✔️

INCR

✔️

✔️

✔️

✔️

INCRBY

✔️

✔️

✔️

✔️

INCRBYFLOAT

✔️

✔️

✔️

✔️

MGET

✔️

⭕️

✔️

✔️

MSET

✔️

⭕️

✔️

✔️

MSETNX

⭕️

⭕️

✔️

✔️

PSETEX

✔️

✔️

✔️

✔️

SET

✔️

✔️

✔️

✔️

SETEX

✔️

✔️

✔️

✔️

SETNX

✔️

✔️

✔️

✔️

SETRANGE

✔️

✔️

✔️

✔️

STRALGO

STRLEN

✔️

✔️

✔️

✔️

Transactions

命令

集群架构

是否允许在集群架构的事务中执行

读写分离架构

是否允许在读写分离架构的事务中执行

DISCARD

✔️

✔️

✔️

✔️

EXEC

✔️

✔️

✔️

✔️

MULTI

✔️

✔️

UNWATCH

✔️

✔️

✔️

WATCH

✔️

✔️