全部產品
Search
文件中心

Tair:叢集架構與讀寫分離架構的命令限制

更新時間:Jun 30, 2024

相對標準架構,叢集架構與讀寫分離架構執行個體在原生Redis命令的支援上有一定的區別,例如禁用某些命令、單個命令不支援訪問跨Slot的Key等,請在使用過程中瞭解並遵守相應的規範。

叢集架構命令限制

Tair叢集架構執行個體相容不同的Redis版本,各版本整體的命令支援情況請參見Tair命令支援

叢集架構支援直連模式與代理模式,其命令限制有所不同:

叢集架構直連模式

  • 由於主流用戶端(例如Jedis用戶端)的自身限制,不支援SELECT命令。

  • 如需執行涉及多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)支援的命令列表。

  • 為便於日常管理和營運,叢集架構代理模式執行個體支援多個自研的命令,更多資訊請參見阿里雲自研的Tair命令

除此之外,Redis Cluster對使用Lua指令碼增加了一些限制,Tair叢集架構在此基礎上存在額外限制,更多資訊請參見叢集中Lua指令碼的限制

讀寫分離架構命令限制

Tair讀寫分離架構執行個體相容不同的Redis版本,各版本整體的命令支援情況請參見Tair命令支援

  • 由於讀寫分離架構預設為代理模式,讀寫分離架構存在代理節點的命令限制,例如代理節點不支援WAITHELLOCLIENT ID等命令,詳細介紹請參見代理模式(Proxy)支援的命令列表

  • 為便於日常管理和營運,讀寫分離架構執行個體支援多個自研的命令,更多資訊請參見阿里雲自研的Tair命令

代理模式(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

✔️

✔️