首页 > 代码库 > 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研究(十九)—命令属性