视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
手把手教你redis数据库的二次开发
2020-11-09 07:33:27 责编:小采
文档


功能说明:通过修改源代码的形式,实现redis自带的命令set key value的功能。并且新的命令为make key value,注意,所有修改的源文件都处于src目录下面 需要修改的部分: 1 redis.c 该文件是redis数据库服务器端主文件,也就是main函数入口处。所有的命令定

功能说明:通过修改源代码的形式,实现redis自带的命令set key value的功能。并且新的命令为make key value,注意,所有修改的源文件都处于src目录下面

需要修改的部分:

1 redis.c

该文件是redis数据库服务器端主文件,也就是main函数入口处。所有的命令定义均在该文件定义的全局变量中。

struct redisCommand redisCommandTable[] = {
 {"get",getCommand,2,"r",0,NULL,1,1,1,0,0},
 {"make",makeCommand,3,"wm",0,NULL,1,1,1,0,0},//our function
 {"set",setCommand,-3,"wm",0,noPreloadGetKeys,1,1,1,0,0},
 {"setnx",setnxCommand,3,"wm",0,noPreloadGetKeys,1,1,1,0,0},
 {"setex",setexCommand,4,"wm",0,noPreloadGetKeys,1,1,1,0,0},
 {"psetex",psetexCommand,4,"wm",0,noPreloadGetKeys,1,1,1,0,0},
 {"append",appendCommand,3,"wm",0,NULL,1,1,1,0,0},
 {"strlen",strlenCommand,2,"r",0,NULL,1,1,1,0,0},

......这里省略.......
结构体redisCommand就是保存redis数据库的所有命令。我们在第二行添加了一句:
 {"make",makeCommand,3,"wm",0,NULL,1,1,1,0,0},//our function
其中注意,第一个参数为命令,第二个为命令调用的函数,第三个三参数。比如set key value 一共就是三个参数,注意如果输入命令和参数不同,服务器端会给出提示。

2 redis.h

该文件是头文件,需要在这里添加对函数的原型声明。

/* Commands prototypes */
void authCommand(redisClient *c);
void pingCommand(redisClient *c);
void echoCommand(redisClient *c);
void setCommand(redisClient *c);
void makeCommand(redisClient *c);
void setnxCommand(redisClient *c);

...............省略.................

我们在头文件上添加我们新的函数原型
void makeCommand(redisClient *c);

3 t_string.c

该文件是函数的实现文件。

//add by jianghuiwen
void makeCommand(redisClient *c)
{
	setKey(c->db,c->argv[1],c->argv[2]);
	addReply(c, shared.ok);
	return;
}
void getCommand(redisClient *c) {
 getGenericCommand(c);
}
如上述所示,
void makeCommand(redisClient *c)
就是我们自己定义的实现函数,

其中参数是redisClient *c,也就是客户端请求(我这里暂时这么说,具体的我会在教程做进一步说明)。

setKey(c->db,c->argv[1],c->argv[2]);这里setKey是一个函数,该函数的作用就是设置数据库中键值的函数,其中第一个参数为系统指定的数据库,第二个参数为客户端请求第二个参数,第三个参数为客户端命令第三个参数。

也就是分别对应:set key value中的key 和value。

addReply(c, shared.ok);是给客户端返回一个OK消息,相当于发一个信号,否则客户端会等待。

上面三个参数修改完成后,在src上一层目录进行make,重新编译,然后运行服务器端和客户端

在客户端输入make name jiang

再输入get name

服务器端会返回jiang。说明执行成功。

如果对于redis安装或者编译有疑问,可以在这篇帖子下留言,我会尽快回答。

下载本文
显示全文
专题