首页 > 代码库 > 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


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