1. 程式人生 > >Redis研究(十九)—命令屬性

Redis研究(十九)—命令屬性

       Redis的不同命令擁有不同的屬性,如是否是隻讀命令,是否是管理員命令等,一個命令可以擁有多個屬性。在一些特殊情況下不同屬性的命令會有不同的表現,下面來逐一介紹。

1、 REDIS_CMD_WRITE
      擁有REDIS_CMD_WRITE屬性的命令的表現是會修改Redis資料庫的資料。一個只讀的從資料庫會拒絕執行擁有REDIS_CMD_WRI TE屬性的命令,另外在Lua指令碼中執行了擁有REDIS_CMD_RANDOM屬性的命令後,不可以再執行擁有REDIS_CMD_WRITE屬性的命令,否則會提示錯誤:“Write commands not  allowed after non deterministic commands.”擁有REDIS_CMD_WRITE 屬性的命令如下,

SET
SETNX
SETEX
PSETEX
APPEND
DEL
SETBIT
SETRANGE
INCR
DECR
RPUSH
LPUSH
RPUSHX
LPUSHX
LINSERT
RPOP
LPOP
BRPOP
BRPOPLPUSH
BLPOP
LSET
LTRIM
LREM
RPOPLPUSH
SADD
SREM
SMOVE
SPOP
SINTERSTORE
SUNIONSTORE
SDIFFSTORE
ZADD
ZINCRBY
ZREM
ZREMRANGEBYSCORE
ZREMRANGEBYRANK
ZUNIONSTORE
ZINTERSTORE
HSET
HSETNX
HMSET
HINCRBY
HINCRBYFLOAT
HDEL
INCRBY
DECRBY
INCRBYFLOAT
GETSET
MSET
MSETNX
MOVE
RENAME
RENAMENX
EXPIRE
EXPIREAT
PEXPIRE
PEXPIREAT
FLUSHDB
FLUSHALL
SORT
PERSIST
RESTORE
MIGRATE
BITOP

2、 REDIS_CMD_DENYOOM
       擁有REDIS_CMD_DENYOOM屬性的命令有可能增加Redis佔用的儲存空間,顯然擁有該屬性的命令都擁有REDIS_CMD_WRI TE屬性,但反之則不然。例如,DEL 命令擁有REDIS_CMD_WRITE屬性,但其總是會減少資料庫的佔用空間,所以不擁有
REDIS_CMD_DENYOOM屬性。
       當資料庫佔用的空間達到了配置檔案中maxmemory 引數指定的值且根據maxmemory-policy 引數的空間釋放規則無法釋放空間時,Redis會拒絕執行擁有REDIS_CMD_DENYOOM屬性的命令。
       擁有REDIS_CMD_DENYOOM屬性的命令每次呼叫時不一定都會使資料庫的佔用空間增大,只是有可能而已。例如,SET命令當新值長度小於舊值時反而會減少資料庫的佔用空間。但無論如何,當資料庫佔用空間超過限制時,Redis都會拒絕執行擁有
REDIS_CMD_DENYOOM屬性的命令,而不會分析其實際上是不是會真的增加空間佔用

。擁有REDIS_CMD_DENYOOM屬性的命令,

SET
SETNX
SETEX
PSETEX
APPEND
SETBIT
SETRANGE
INCR
DECR
RPUSH
LPUSH
RPUSHX
LPUSHX
LINSERT
BRPOPLPUSH
LSET
RPOPLPUSH
SADD
SINTERSTORE
SUNIONSTORE
SDIFFSTORE
ZADD
ZINCRBY
ZUNIONSTORE
ZINTERSTORE
HSET
HSETNX
HMSET
HINCRBY
HINCRBYFLOAT
INCRBY
DECRBY
INCRBYFLOAT
GETSET
MSET
MSETNX
SORT
RESTORE
BITOP

3、 REDIS_CMD_NOSCRIPT
      擁有REDIS_CMD_NOSCRIPT屬性的命令無法在Redis指令碼中執行。EVAL和EVALSHA命令也擁有該屬性,所以在指令碼中無法呼叫這兩個命令,即不能在指令碼中呼叫指令碼。
擁有REDIS_CMD_NOSCRIPT屬性的命令如下:

BRPOP
BRPOPLPUSH
BLPOP
SPOP
AUTH
SAVE
MULTI
EXEC
DISCARD
SYNC
REPLCONF
MONITOR
SLAVEOF
DEBUG
SUBSCRIBE
UNSUBSCRIBE
PSUBSCRIBE
PUNSUBSCRIBE
WATCH
UNWATCH
EVAL
EVALSHA
SCRIPT

4、 REDIS_CMD_RANDOM
       當一個指令碼執行了擁有REDIS_CMD_RANDOM屬性的命令後,就不能執行擁有REDIS_CMD_WRITE屬性的命令了。擁有REDIS_CMD_RANDOM的命令如下,
SPOP
SRANDMEMBER
RANDOMKEY
TIME

5 、REDIS_CMD_SORT_FOR_SCRIPT
      擁有REDIS_CMD_SORT_FOR_SCRIPT屬性的命令會產生隨機結果,在指令碼中呼叫這些命令時Redis會對結果進行排序。
擁有REDIS_CMD_SORT_FOR_SCRIPT屬性的命令如下,
SINTER
SUNION
SDIFF
SMEMBERS
HKEYS
HVALS
KEYS

6 、REDIS_CMD_LOADING

      當Redis正在啟動時(將資料從硬碟載入到記憶體中),Redis只會執行擁有REDIS_CMD_LOADI NG屬性的命令。
擁有REDIS_CMD_LOADING屬性的命令如下:
INFO
SUBSCRIBE
UNSUBSCRIBE
PSUBSCRIBE
PUNSUBSCRIBE
PUBLISH