Redis中命令表构造 简单版

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;
}  

结果:
在这里插入图片描述

发布了46 篇原创文章 · 获赞 19 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/li123_123_/article/details/103785757