redis中命令表的构造
redis源码中通过在服务器Server中构造出一个命令表server.commands,来响应用户的请求,通过二进制 | 运算符来生成整数类型的命令,确保了命令的确定性和唯一性。跟数据结构中前缀码的思想类似。
#include <map>
#include <string>
#include <iostream>
using namespace std;
struct redisCommand {
// 命令名字
char *name;
// 参数个数
int arity;
// 字符串表示的 FLAG
char *sflags;
//实际flags
int flags;
};
struct redisCommand redisCommandTable[] = {
{"get",2,"r",0},
{"set",-3,"wm",0},
{"setnx",3,"wm",0},
{"setex",4,"wm",0},
{"psetex",4,"wm",0},
{"append",3,"wm",0},
{"strlen",2,"r",0},
{"del",-2,"w",0},
{"exists",2,"r",0}
};
int main()
{
int j;
// 命令的数量
int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);
for (j = 0; j < numcommands; j++) {
// 指定命令
struct redisCommand *c = redisCommandTable+j;
cout<<c->name<<endl;
char *f = c->sflags;
while(*f != '\0'){
switch(*f){
case 'w': c->flags |= 1; break;
case 'r': c->flags |= 2; break;
case 'm': c->flags |= 4; break;
case 'a': c->flags |= 8; break;
case 'p': c->flags |= 16; break;
case 's': c->flags |= 32; break;
case 'R': c->flags |= 64; break;
case 'S': c->flags |= 128; break;
case 'l': c->flags |= 256; break;
case 't': c->flags |= 512; break;
case 'M': c->flags |= 1024; break;
case 'k': c->flags |= 2048; break;
default: cout<<"I don't know!!"<<endl;break;
}
cout <<"char Flag:" <<*f << endl;
cout<< "real Flag: " << c->flags << endl;
f++;
}
cout<< "call dictAdd() success!!" <<endl;
}
return 0;
}
结果: