typedef int *redisGetKeysProc(struct redisCommand *cmd, robj **argv, int argc, int *numkeys);
struct redisCommand {
char *name;//命令字符串
redisCommandProc *proc;//命令执行函数
int arity;//参数个数, -N代表参数个数>=N
char *sflags; //命令的sflags属性字符串
int flags; //从sflags获取的整数mask值
redisGetKeysProc *getkeys_proc;//获取key参数的可选函数,当下面3种情况都无法确定key参数的时候才需要使用该函数
int firstkey; //第一个参数就是KEY
int lastkey; //最后一个参数是KEY
int keystep; //参数为 key,val,key,val,...格式
long long microseconds;//此命令的总执行时间,单位:微秒
long long calls;//该命令执行的次数
};
flags, microseconds 和 calls 这三个字段由redis自己计算,计算完毕后会重置为0
sflags参数的意义:
* w: 写入
* r: 读取
* m: 每调用一次都会增加内存的使用量,当没有内存的时候不允许执行
* a: 系统管理员才能执行的命令
* p: 发布订阅相关的命令
* f: 强制复制该命令,不考虑数据的正确性
* s: 命令不允许在脚本中执行
* R: 随机命令。命令结果是不确定的,同样的命令,同样的参数,同样的key,可能会得到不同的结果,比如SPOP和RANDOMKEY命令
* S: 排序命令,输出数组,输出是确定的
* l: 加载数据库时允许执行的命令 Allow command while loading the database.
* t: 当数据在主服务器上没有,但是在从服务器上有时,可以执行的命令 正常情况下是没有这样的命令可以接受的,但是也有例外
* M: 在监视器上不会自动传播的命令 Do not automatically propagate the command on MONITOR.
* k: 执行对该命令的隐式询问,假如被标记为 'importing',则该命令可以在集群模式运行.
* F: 可以在常数时间内执行完毕的命令,那种可能会触发一个DEL的删除操作的副作用的命令,比如SET命令,就不属于常数时间内执行完毕的命令。
http://redisdoc.com/index.html
struct redisCommand redisCommandTable[] = {
{"module",moduleCommand,-2,"as",0,NULL,0,0,0,0,0},
{"get",getCommand,2,"rF",0,NULL,1,1,1,0,0},
{"set",setCommand,-3,"wm",0,NULL,1,1,1,0,0},
{"setnx",setnxCommand,3,"wmF",0,NULL,1,1,1,0,0},将 key 的值设为 value,当且仅当 key 不存在。 若给定的 key 已经存在,则 SETNX 不做任何动作。 SETNX 是SET if Not eXists的简写。
{"setex",setexCommand,4,"wm",0,NULL,1,1,1,0,0},写入一个新的key-value值,和set相比,多了一个时间参数,时间单位为秒
{"psetex",psetexCommand,4,"wm",0,NULL,1,1,1,0,0},写入一个新的key-value值,和set相比,多了一个时间参数,时间单位为毫秒
{"append",appendCommand,3,"wm",0,NULL,1,1,1,0,0},写入,将value追加到之前的值后面,不存在则创建键值对,如同set
{"strlen",strlenCommand,2,"rF",0,NULL,1,1,1,0,0},返回 key 所储存的字符串值的长度
{"del",delCommand,-2,"w",0,NULL,1,-1,1,0,0},删除给定的一个或多个 key,不存在的 key 会被忽略
{"unlink",unlinkCommand,-2,"wF",0,NULL,1,-1,1,0,0},在 Redis 4.0 之前, 用户在使用 DEL 命令删除体积较大的键, 又或者在使用 FLUSHDB 和 FLUSHALL 删除包含大量键的数据库时,都可能会造成服务器阻塞。为了解决以上问题, Redis 4.0 新添加了 UNLINK 命令, 这个命令是 DEL 命令的异步版本,它可以将删除指定键的操作放在后台线程里面执行, 从而尽可能地避免服务器阻塞。
{"exists",existsCommand,-2,"rF",0,NULL,1,-1,1,0,0},检查给定 key 是否存在
{"setbit",setbitCommand,4,"wm",0,NULL,1,1,1,0,0},对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)
{"getbit",getbitCommand,3,"rF",0,NULL,1,1,1,0,0},对 key 所储存的字符串值,获取指定偏移量上的位(bit)
{"bitfield",bitfieldCommand,-2,"wm",0,NULL,1,1,1,0,0},可以将一个 Redis 字符串看作是一个由二进制位组成的数组, 并对这个数组中储存的长度不同的整数进行访问
{"setrange",setrangeCommand,4,"wm",0,NULL,1,1,1,0,0},用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始
{"getrange",getrangeCommand,4,"r",0,NULL,1,1,1,0,0},返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)
{"substr",getrangeCommand,4,"r",0,NULL,1,1,1,0,0},返回名称为key的string的value的子串
{"incr",incrCommand,2,"wmF",0,NULL,1,1,1,0,0},将 key 中储存的数字值增一
{"decr",decrCommand,2,"wmF",0,NULL,1,1,1,0,0},将 key 中储存的数字值减一
{"mget",mgetCommand,-2,"rF",0,NULL,1,-1,1,0,0},返回所有(一个或多个)给定 key 的值 MGET key [key ...]
{"rpush",rpushCommand,-3,"wmF",0,NULL,1,1,1,0,0},将一个或多个值 value 插入到列表 key 的表尾(最右边)。RPUSH key value [value ...]
{"lpush",lpushCommand,-3,"wmF",0,NULL,1,1,1,0,0},将一个或多个值 value 插入到列表 key 的表头 LPUSH key value [value ...]
{"rpushx",rpushxCommand,-3,"wmF",0,NULL,1,1,1,0,0},将值 value 插入到列表 key 的表尾,当且仅当 key 存在并且是一个列表。当 key 不存在时, 什么也不做
{"lpushx",lpushxCommand,-3,"wmF",0,NULL,1,1,1,0,0},将值 value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表。当 key 不存在时, 什么也不做
{"linsert",linsertCommand,5,"wm",0,NULL,1,1,1,0,0},将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。当 pivot 不存在于列表 key 时,不执行任何操作。
{"rpop",rpopCommand,2,"wF",0,NULL,1,1,1,0,0},移除并返回列表 key 的尾元素。
{"lpop",lpopCommand,2,"wF",0,NULL,1,1,1,0,0},移除并返回列表 key 的头元素。
{"brpop",brpopCommand,-3,"ws",0,NULL,1,-2,1,0,0},它是 RPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BRPOP 命令阻塞,直到等待超时或发现可弹出元素为止。
{"brpoplpush",brpoplpushCommand,4,"wms",0,NULL,1,2,1,0,0},BRPOPLPUSH 是 RPOPLPUSH 的阻塞版本,当给定列表 source 不为空时, BRPOPLPUSH 的表现和 RPOPLPUSH 一样。当列表 source 为空时, BRPOPLPUSH 命令将阻塞连接,直到等待超时,或有另一个客户端对 source 执行 LPUSH 或 RPUSH 命令为止。超时参数 timeout 接受一个以秒为单位的数字作为值。超时参数设为 0 表示阻塞时间可以无限期延长(block indefinitely) 。
{"blpop",blpopCommand,-3,"ws",0,NULL,1,-2,1,0,0},它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。
{"llen",llenCommand,2,"rF",0,NULL,1,1,1,0,0},返回列表 key 的长度,如果 key 不存在,则 key 被解释为一个空列表,返回 0
{"lindex",lindexCommand,3,"r",0,NULL,1,1,1,0,0},返回列表 key 中,下标为 index 的元素,下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推
{"lset",lsetCommand,4,"wm",0,NULL,1,1,1,0,0},将列表 key 下标为 index 的元素的值设置为 value
{"lrange",lrangeCommand,4,"r",0,NULL,1,1,1,0,0},返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定,下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推
{"ltrim",ltrimCommand,4,"w",0,NULL,1,1,1,0,0},对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
{"lrem",lremCommand,4,"w",0,NULL,1,1,1,0,0},根据参数 count 的值,移除列表中与参数 value 相等的元素
{"rpoplpush",rpoplpushCommand,3,"wm",0,NULL,1,2,1,0,0},在一个原子时间内,执行以下两个动作:将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。
{"sadd",saddCommand,-3,"wmF",0,NULL,1,1,1,0,0},将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
{"srem",sremCommand,-3,"wF",0,NULL,1,1,1,0,0},移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。
{"smove",smoveCommand,4,"wF",0,NULL,1,2,1,0,0},将 member 元素从 source 集合移动到 destination 集合。
{"sismember",sismemberCommand,3,"rF",0,NULL,1,1,1,0,0},判断 member 元素是否集合 key 的成员。
{"scard",scardCommand,2,"rF",0,NULL,1,1,1,0,0},返回集合 key 的基数(集合中元素的数量)。
{"spop",spopCommand,-2,"wRF",0,NULL,1,1,1,0,0},移除并返回集合中的一个随机元素。如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。
{"srandmember",srandmemberCommand,-2,"rR",0,NULL,1,1,1,0,0},如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。
{"sinter",sinterCommand,-2,"rS",0,NULL,1,-1,1,0,0},返回一个集合的全部成员,该集合是所有给定集合的交集。
{"sinterstore",sinterstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0},这个命令类似于 SINTER 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。如果 destination 集合已经存在,则将其覆盖。
{"sunion",sunionCommand,-2,"rS",0,NULL,1,-1,1,0,0},返回一个集合的全部成员,该集合是所有给定集合的并集。
{"sunionstore",sunionstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0},这个命令类似于 SUNION 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。
{"sdiff",sdiffCommand,-2,"rS",0,NULL,1,-1,1,0,0},返回一个集合的全部成员,该集合是所有给定集合之间的差集。
{"sdiffstore",sdiffstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0},这个命令的作用和 SDIFF 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。
{"smembers",sinterCommand,2,"rS",0,NULL,1,1,1,0,0},返回集合 key 中的所有成员。
{"sscan",sscanCommand,-3,"rR",0,NULL,1,1,1,0,0},SCAN 命令及其相关的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都用于增量地迭代(incrementally iterate)一集元素
SCAN 命令用于迭代当前数据库中的数据库键。
SSCAN 命令用于迭代集合键中的元素。
HSCAN 命令用于迭代哈希键中的键值对。
ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。
{"zadd",zaddCommand,-4,"wmF",0,NULL,1,1,1,0,0},将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
{"zincrby",zincrbyCommand,4,"wmF",0,NULL,1,1,1,0,0},为有序集 key 的成员 member 的 score 值加上增量 increment 。可以通过传递一个负数值 increment ,让 score 减去相应的值
{"zrem",zremCommand,-3,"wF",0,NULL,1,1,1,0,0},
{"zremrangebyscore",zremrangebyscoreCommand,4,"w",0,NULL,1,1,1,0,0},
{"zremrangebyrank",zremrangebyrankCommand,4,"w",0,NULL,1,1,1,0,0},
{"zremrangebylex",zremrangebylexCommand,4,"w",0,NULL,1,1,1,0,0},
{"zunionstore",zunionstoreCommand,-4,"wm",0,zunionInterGetKeys,0,0,0,0,0},
{"zinterstore",zinterstoreCommand,-4,"wm",0,zunionInterGetKeys,0,0,0,0,0},
{"zrange",zrangeCommand,-4,"r",0,NULL,1,1,1,0,0},
{"zrangebyscore",zrangebyscoreCommand,-4,"r",0,NULL,1,1,1,0,0},
{"zrevrangebyscore",zrevrangebyscoreCommand,-4,"r",0,NULL,1,1,1,0,0},
{"zrangebylex",zrangebylexCommand,-4,"r",0,NULL,1,1,1,0,0},
{"zrevrangebylex",zrevrangebylexCommand,-4,"r",0,NULL,1,1,1,0,0},
{"zcount",zcountCommand,4,"rF",0,NULL,1,1,1,0,0},
{"zlexcount",zlexcountCommand,4,"rF",0,NULL,1,1,1,0,0},
{"zrevrange",zrevrangeCommand,-4,"r",0,NULL,1,1,1,0,0},
{"zcard",zcardCommand,2,"rF",0,NULL,1,1,1,0,0},
{"zscore",zscoreCommand,3,"rF",0,NULL,1,1,1,0,0},
{"zrank",zrankCommand,3,"rF",0,NULL,1,1,1,0,0},
{"zrevrank",zrevrankCommand,3,"rF",0,NULL,1,1,1,0,0},
{"zscan",zscanCommand,-3,"rR",0,NULL,1,1,1,0,0},
{"zpopmin",zpopminCommand,-2,"wF",0,NULL,1,1,1,0,0},
{"zpopmax",zpopmaxCommand,-2,"wF",0,NULL,1,1,1,0,0},
{"bzpopmin",bzpopminCommand,-2,"wsF",0,NULL,1,-2,1,0,0},
{"bzpopmax",bzpopmaxCommand,-2,"wsF",0,NULL,1,-2,1,0,0},
{"hset",hsetCommand,-4,"wmF",0,NULL,1,1,1,0,0},
{"hsetnx",hsetnxCommand,4,"wmF",0,NULL,1,1,1,0,0},
{"hget",hgetCommand,3,"rF",0,NULL,1,1,1,0,0},
{"hmset",hsetCommand,-4,"wmF",0,NULL,1,1,1,0,0},
{"hmget",hmgetCommand,-3,"rF",0,NULL,1,1,1,0,0},
{"hincrby",hincrbyCommand,4,"wmF",0,NULL,1,1,1,0,0},
{"hincrbyfloat",hincrbyfloatCommand,4,"wmF",0,NULL,1,1,1,0,0},
{"hdel",hdelCommand,-3,"wF",0,NULL,1,1,1,0,0},
{"hlen",hlenCommand,2,"rF",0,NULL,1,1,1,0,0},
{"hstrlen",hstrlenCommand,3,"rF",0,NULL,1,1,1,0,0},
{"hkeys",hkeysCommand,2,"rS",0,NULL,1,1,1,0,0},
{"hvals",hvalsCommand,2,"rS",0,NULL,1,1,1,0,0},
{"hgetall",hgetallCommand,2,"rR",0,NULL,1,1,1,0,0},
{"hexists",hexistsCommand,3,"rF",0,NULL,1,1,1,0,0},
{"hscan",hscanCommand,-3,"rR",0,NULL,1,1,1,0,0},
{"incrby",incrbyCommand,3,"wmF",0,NULL,1,1,1,0,0},将 key 所储存的值加上增量 increment
{"decrby",decrbyCommand,3,"wmF",0,NULL,1,1,1,0,0},将 key 所储存的值加上减量 increment
{"incrbyfloat",incrbyfloatCommand,3,"wmF",0,NULL,1,1,1,0,0},为 key 中所储存的值加上浮点数增量 increment
{"getset",getsetCommand,3,"wm",0,NULL,1,1,1,0,0},
{"mset",msetCommand,-3,"wm",0,NULL,1,-1,2,0,0},
{"msetnx",msetnxCommand,-3,"wm",0,NULL,1,-1,2,0,0},
{"randomkey",randomkeyCommand,1,"rR",0,NULL,0,0,0,0,0},
{"select",selectCommand,2,"lF",0,NULL,0,0,0,0,0},
{"swapdb",swapdbCommand,3,"wF",0,NULL,0,0,0,0,0},这个命令可以对指定的两个数据库进行互换: 比如说, 通过执行命令 SWAPDB 0 1 , 我们可以将原来的数据库 0 变成数据库 1 ,而原来的数据库 1 则变成数据库 0
{"move",moveCommand,3,"wF",0,NULL,1,1,1,0,0},
{"rename",renameCommand,3,"w",0,NULL,1,2,1,0,0},
{"renamenx",renamenxCommand,3,"wF",0,NULL,1,2,1,0,0},
{"expire",expireCommand,3,"wF",0,NULL,1,1,1,0,0},
{"expireat",expireatCommand,3,"wF",0,NULL,1,1,1,0,0},
{"pexpire",pexpireCommand,3,"wF",0,NULL,1,1,1,0,0},
{"pexpireat",pexpireatCommand,3,"wF",0,NULL,1,1,1,0,0},
{"keys",keysCommand,2,"rS",0,NULL,0,0,0,0,0},
{"scan",scanCommand,-2,"rR",0,NULL,0,0,0,0,0},
{"dbsize",dbsizeCommand,1,"rF",0,NULL,0,0,0,0,0},
{"auth",authCommand,2,"sltF",0,NULL,0,0,0,0,0},
{"ping",pingCommand,-1,"tF",0,NULL,0,0,0,0,0},
{"echo",echoCommand,2,"F",0,NULL,0,0,0,0,0},
{"save",saveCommand,1,"as",0,NULL,0,0,0,0,0},
{"bgsave",bgsaveCommand,-1,"as",0,NULL,0,0,0,0,0},
{"bgrewriteaof",bgrewriteaofCommand,1,"as",0,NULL,0,0,0,0,0},
{"shutdown",shutdownCommand,-1,"aslt",0,NULL,0,0,0,0,0},
{"lastsave",lastsaveCommand,1,"RF",0,NULL,0,0,0,0,0},
{"type",typeCommand,2,"rF",0,NULL,1,1,1,0,0},
{"multi",multiCommand,1,"sF",0,NULL,0,0,0,0,0},
{"exec",execCommand,1,"sM",0,NULL,0,0,0,0,0},
{"discard",discardCommand,1,"sF",0,NULL,0,0,0,0,0},
{"sync",syncCommand,1,"ars",0,NULL,0,0,0,0,0},
{"psync",syncCommand,3,"ars",0,NULL,0,0,0,0,0},
{"replconf",replconfCommand,-1,"aslt",0,NULL,0,0,0,0,0},
{"flushdb",flushdbCommand,-1,"w",0,NULL,0,0,0,0,0},Redis 4.0 中的 FLUSHDB 和 FLUSHALL 这两个命令都新添加了 ASYNC 选项, 带有这个选项的数据库删除操作将在后台线程进行
{"flushall",flushallCommand,-1,"w",0,NULL,0,0,0,0,0},Redis 4.0 中的 FLUSHDB 和 FLUSHALL 这两个命令都新添加了 ASYNC 选项, 带有这个选项的数据库删除操作将在后台线程进行
{"sort",sortCommand,-2,"wm",0,sortGetKeys,1,1,1,0,0},
{"info",infoCommand,-1,"ltR",0,NULL,0,0,0,0,0},
{"monitor",monitorCommand,1,"as",0,NULL,0,0,0,0,0},
{"ttl",ttlCommand,2,"rFR",0,NULL,1,1,1,0,0},
{"touch",touchCommand,-2,"rF",0,NULL,1,1,1,0,0},
{"pttl",pttlCommand,2,"rFR",0,NULL,1,1,1,0,0},
{"persist",persistCommand,2,"wF",0,NULL,1,1,1,0,0},
{"slaveof",replicaofCommand,3,"ast",0,NULL,0,0,0,0,0},
{"replicaof",replicaofCommand,3,"ast",0,NULL,0,0,0,0,0},
{"role",roleCommand,1,"lst",0,NULL,0,0,0,0,0},
{"debug",debugCommand,-2,"as",0,NULL,0,0,0,0,0},
{"config",configCommand,-2,"last",0,NULL,0,0,0,0,0},
{"subscribe",subscribeCommand,-2,"pslt",0,NULL,0,0,0,0,0},
{"unsubscribe",unsubscribeCommand,-1,"pslt",0,NULL,0,0,0,0,0},
{"psubscribe",psubscribeCommand,-2,"pslt",0,NULL,0,0,0,0,0},
{"punsubscribe",punsubscribeCommand,-1,"pslt",0,NULL,0,0,0,0,0},
{"publish",publishCommand,3,"pltF",0,NULL,0,0,0,0,0},
{"pubsub",pubsubCommand,-2,"pltR",0,NULL,0,0,0,0,0},
{"watch",watchCommand,-2,"sF",0,NULL,1,-1,1,0,0},
{"unwatch",unwatchCommand,1,"sF",0,NULL,0,0,0,0,0},
{"cluster",clusterCommand,-2,"a",0,NULL,0,0,0,0,0},
{"restore",restoreCommand,-4,"wm",0,NULL,1,1,1,0,0},
{"restore-asking",restoreCommand,-4,"wmk",0,NULL,1,1,1,0,0},
{"migrate",migrateCommand,-6,"wR",0,migrateGetKeys,0,0,0,0,0},
{"asking",askingCommand,1,"F",0,NULL,0,0,0,0,0},
{"readonly",readonlyCommand,1,"F",0,NULL,0,0,0,0,0},
{"readwrite",readwriteCommand,1,"F",0,NULL,0,0,0,0,0},
{"dump",dumpCommand,2,"rR",0,NULL,1,1,1,0,0},
{"object",objectCommand,-2,"rR",0,NULL,2,2,1,0,0},
{"memory",memoryCommand,-2,"rR",0,NULL,0,0,0,0,0},新添加了一个 MEMORY 命令, 这个命令可以用于视察内存使用情况, 并进行相应的内存管理操作
{"client",clientCommand,-2,"as",0,NULL,0,0,0,0,0},
{"eval",evalCommand,-3,"s",0,evalGetKeys,0,0,0,0,0},
{"evalsha",evalShaCommand,-3,"s",0,evalGetKeys,0,0,0,0,0},
{"slowlog",slowlogCommand,-2,"aR",0,NULL,0,0,0,0,0},
{"script",scriptCommand,-2,"s",0,NULL,0,0,0,0,0},
{"time",timeCommand,1,"RF",0,NULL,0,0,0,0,0},
{"bitop",bitopCommand,-4,"wm",0,NULL,2,-1,1,0,0},
{"bitcount",bitcountCommand,-2,"r",0,NULL,1,1,1,0,0},
{"bitpos",bitposCommand,-3,"r",0,NULL,1,1,1,0,0},
{"wait",waitCommand,3,"s",0,NULL,0,0,0,0,0},
{"command",commandCommand,0,"ltR",0,NULL,0,0,0,0,0},
{"geoadd",geoaddCommand,-5,"wm",0,NULL,1,1,1,0,0},
{"georadius",georadiusCommand,-6,"w",0,georadiusGetKeys,1,1,1,0,0},
{"georadius_ro",georadiusroCommand,-6,"r",0,georadiusGetKeys,1,1,1,0,0},
{"georadiusbymember",georadiusbymemberCommand,-5,"w",0,georadiusGetKeys,1,1,1,0,0},
{"georadiusbymember_ro",georadiusbymemberroCommand,-5,"r",0,georadiusGetKeys,1,1,1,0,0},
{"geohash",geohashCommand,-2,"r",0,NULL,1,1,1,0,0},
{"geopos",geoposCommand,-2,"r",0,NULL,1,1,1,0,0},
{"geodist",geodistCommand,-4,"r",0,NULL,1,1,1,0,0},
{"pfselftest",pfselftestCommand,1,"a",0,NULL,0,0,0,0,0},
{"pfadd",pfaddCommand,-2,"wmF",0,NULL,1,1,1,0,0},
{"pfcount",pfcountCommand,-2,"r",0,NULL,1,-1,1,0,0},
{"pfmerge",pfmergeCommand,-2,"wm",0,NULL,1,-1,1,0,0},
{"pfdebug",pfdebugCommand,-3,"w",0,NULL,0,0,0,0,0},
{"xadd",xaddCommand,-5,"wmFR",0,NULL,1,1,1,0,0},
{"xrange",xrangeCommand,-4,"r",0,NULL,1,1,1,0,0},
{"xrevrange",xrevrangeCommand,-4,"r",0,NULL,1,1,1,0,0},
{"xlen",xlenCommand,2,"rF",0,NULL,1,1,1,0,0},
{"xread",xreadCommand,-4,"rs",0,xreadGetKeys,1,1,1,0,0},
{"xreadgroup",xreadCommand,-7,"ws",0,xreadGetKeys,1,1,1,0,0},
{"xgroup",xgroupCommand,-2,"wm",0,NULL,2,2,1,0,0},
{"xsetid",xsetidCommand,3,"wmF",0,NULL,1,1,1,0,0},
{"xack",xackCommand,-4,"wF",0,NULL,1,1,1,0,0},
{"xpending",xpendingCommand,-3,"rR",0,NULL,1,1,1,0,0},
{"xclaim",xclaimCommand,-6,"wRF",0,NULL,1,1,1,0,0},
{"xinfo",xinfoCommand,-2,"rR",0,NULL,2,2,1,0,0},
{"xdel",xdelCommand,-3,"wF",0,NULL,1,1,1,0,0},
{"xtrim",xtrimCommand,-2,"wFR",0,NULL,1,1,1,0,0},
{"post",securityWarningCommand,-1,"lt",0,NULL,0,0,0,0,0},
{"host:",securityWarningCommand,-1,"lt",0,NULL,0,0,0,0,0},
{"latency",latencyCommand,-2,"aslt",0,NULL,0,0,0,0,0},
{"lolwut",lolwutCommand,-1,"r",0,NULL,0,0,0,0,0}
};
Redis command interpretation can be seen like this: http://redisdoc.com/index.html
Redis has three parameter configurations to manage lazyfree to avoid blocking when deleting large blocks of data
"lazyfree-lazy-eviction", server.lazyfree_lazy_eviction
"lazyfree-lazy-expire", server.lazyfree_lazy_expire
"lazyfree-lazy-server-del", server.lazyfree_lazy_server_del
Configured to 1, then asynchronous delete, dbAsyncDelete(db,key)
Configured as 0, it will be deleted synchronously, dbSyncDelete(db,key)