Redis source code analysis (1)-Command entry


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)

 

Guess you like

Origin blog.csdn.net/langeldep/article/details/85251685