我们一次来看这份代码,揭开redis服务器的神秘面纱。
首先是命令映射表:
/*命令映射表,参数1:命令,参数2:指向实现此命令的函数,参数3:参数个数,参数4:标志位(具体信息看注释),
*参数5:从参数4计算而得到的字节掩码,参数6:作为可选项的获取键值的函数,参数7:第一个索引位置,参数8:最后一个索引位置
*参数9:增量,参数10:命令执行时间,参数11:命令调用次数
*/
struct redisCommand redisCommandTable[] = {
//获取字符串命令
{"get",getCommand,2,"rF",0,NULL,1,1,1,0,0},
//设置字符串命令
{"set",setCommand,-3,"wm",0,NULL,1,1,1,0,0},
//当且仅当key不存在的情况设置字符串
{"setnx",setnxCommand,3,"wmF",0,NULL,1,1,1,0,0},
//当且仅当key存在的情况设置字符串,生存时间为秒级
{"setex",setexCommand,4,"wm",0,NULL,1,1,1,0,0},
//设置字符串,生存时间为毫秒级
{"psetex",psetexCommand,4,"wm",0,NULL,1,1,1,0,0},
//如果key存在则在末尾加如果不存在就相当于set
{"append",appendCommand,3,"wm",0,NULL,1,1,1,0,0},
//字符串长度
{"strlen",strlenCommand,2,"rF",0,NULL,1,1,1,0,0},
//删除一个或多个key
{"del",delCommand,-2,"w",0,NULL,1,-1,1,0,0},
//判断key是否存在
{"exists",existsCommand,2,"rF",0,NULL,1,1,1,0,0},
//当key存在时清除偏移量后面的值,否则自动生成新字符串
{"setbit",setbitCommand,4,"wm",0,NULL,1,1,1,0,0},
//获取指定偏移量后的位
{"getbit",getbitCommand,3,"rF",0,NULL,1,1,1,0,0},
{"setrange",setrangeCommand,4,"wm",0,NULL,1,1,1,0,0},
{"getrange",getrangeCommand,4,"r",0,NULL,1,1,1,0,0},
{"substr",getrangeCommand,4,"r",0,NULL,1,1,1,0,0},
{"incr",incrCommand,2,"wmF",0,NULL,1,1,1,0,0},
{"decr",decrCommand,2,"wmF",0,NULL,1,1,1,0,0},
{"mget",mgetCommand,-2,"r",0,NULL,1,-1,1,0,0},
{"rpush",rpushCommand,-3,"wmF",0,NULL,1,1,1,0,0},
{"lpush",lpushCommand,-3,"wmF",0,NULL,1,1,1,0,0},
{"rpushx",rpushxCommand,3,"wmF",0,NULL,1,1,1,0,0},
{"lpushx",lpushxCommand,3,"wmF",0,NULL,1,1,1,0,0},
{"linsert",linsertCommand,5,"wm",0,NULL,1,1,1,0,0},
{"rpop",rpopCommand,2,"wF",0,NULL,1,1,1,0,0},
{"lpop",lpopCommand,2,"wF",0,NULL,1,1,1,0,0},
{"brpop",brpopCommand,-3,"ws",0,NULL,1,1,1,0,0},
{"brpoplpush",brpoplpushCommand,4,"wms",0,NULL,1,2,1,0,0},
{"blpop",blpopCommand,-3,"ws",0,NULL,1,-2,1,0,0},
{"llen",llenCommand,2,"rF",0,NULL,1,1,1,0,0},
{"lindex",lindexCommand,3,"r",0,NULL,1,1,1,0,0},
{"lset",lsetCommand,4,"wm",0,NULL,1,1,1,0,0},
{"lrange",lrangeCommand,4,"r",0,NULL,1,1,1,0,0},
{"ltrim",ltrimCommand,4,"w",0,NULL,1,1,1,0,0},
{"lrem",lremCommand,4,"w",0,NULL,1,1,1,0,0},
{"rpoplpush",rpoplpushCommand,3,"wm",0,NULL,1,2,1,0,0},
{"sadd",saddCommand,-3,"wmF",0,NULL,1,1,1,0,0},
{"srem",sremCommand,-3,"wF",0,NULL,1,1,1,0,0},
{"smove",smoveCommand,4,"wF",0,NULL,1,2,1,0,0},
{"sismember",sismemberCommand,3,"rF",0,NULL,1,1,1,0,0},
{"scard",scardCommand,2,"rF",0,NULL,1,1,1,0,0},
{"spop",spopCommand,2,"wRsF",0,NULL,1,1,1,0,0},
{"srandmember",srandmemberCommand,-2,"rR",0,NULL,1,1,1,0,0},
{"sinter",sinterCommand,-2,"rS",0,NULL,1,-1,1,0,0},
{"sinterstore",sinterstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0},
{"sunion",sunionCommand,-2,"rS",0,NULL,1,-1,1,0,0},
{"sunionstore",sunionstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0},
{"sdiff",sdiffCommand,-2,"rS",0,NULL,1,-1,1,0,0},
{"sdiffstore",sdiffstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0},
{"smembers",sinterCommand,2,"rS",0,NULL,1,1,1,0,0},
{"sscan",sscanCommand,-3,"rR",0,NULL,1,1,1,0,0},
{"zadd",zaddCommand,-4,"wmF",0,NULL,1,1,1,0