Redis源码之经常使用数据结构和函数

上一篇 扩展Redis:增长Redis命令 讲了如何动手编写一个命令,但没有具体讲代码的细节,今天讲下Redis代码中的经常使用数据结构和函数,看完这篇文章但愿你们本身能写一个helloworld的命令。 redis

首先讲下环境,代码的版本仍是3.2.11的。 sql

1、数据结构数据库

一、robj缓存

robj是Redis源码中用的很是多的数据结构,包括咱们输入的命令和参数在服务端都是以robj来表示的。数据结构

typedef struct redisObject {

其中比较重要的是type和ptr字段,type表示数据的类型,经常使用类型有:函数

#define OBJ_STRING 0

全部客户端输入过来的参数都是STRIGN类型,即咱们输入命令:spa

set key value设计

则服务端会生成3个robj对象,每一个的type都是 OBJ_STRING。3d

能够参考typeCommand的代码:指针

void typeCommand(client *c) {

还有一个重要的字段是ptr,这是一个void类型,便可以表明任何类型,若是是type为OBJ_STRING,则ptr是一个char*的指针。

另外就是encoding字段了,上面发现全部基本类型是字符串,若是要表示整型怎么办呢,就是经过encoding帮忙了,能够看下代码:

int isObjectRepresentableAsLongLong(robj *o, long long *llval) {

二、client

client结构表明一个链接,固然一个从Redis也是一个链接,因此这个结构有从的一些信息:

/* With multiplexing we need to take per-client state.

整个结构体字段比较多,重点关注如下几块:

argc:参数个数

argv:具体一个个的参数

db:当前选择的数据库

argv[0]表示咱们的命令,后面就是命令具体的参数了,若是咱们输入命令:

set name ljh

则:

c->argv[0]表示set命令,type为OBJ_STRING,ptr是一个char*;

c->argv[1]表示参数name,type为OBJ_STRING,ptr是一个char*;

c->argv[2]表示参数ljh,type为OBJ_STRING,ptr是一个char*;

经过解析c->argv参数,咱们就能够获得一个个的参数进行验证和处理了。

2、经常使用函数

一、addReplyError

通常表示执行遇到错误,返回客户端一个错误;

这个函数有2个参数,第一个是一个client的指针,第二个为错误字符串:

addReplyError(c,"increxpire command maxNum param must bigger or equal than 0");

二、addReply

向输出缓存区增长内容;

有2个参数,第一个也是一个client的指针,第二个是一个robj的指针:

addReply(c,shared.colon);

上面是上一篇扩展命令里的代码,若是O的type为OBJ_STRIGN,而且encoding是OBJ_ENCODING_INT,值为5,这里表示向客户端输出如下内容:

:5\r\n

这里讲下Redis协议,响应这块的协议以下:

状态回复(status reply)的第一个字节是 “+”

错误回复(error reply)的第一个字节是 “-“

整数回复(integer reply)的第一个字节是 “:”

批量回复(bulk reply)的第一个字节是 “$”

多条批量回复(multi bulk reply)的第一个字节是 “*”

由于咱们的incexpire返回一个整型数字,因此先是:,而后是数字,最后是表示结束的换行和回车。

三、lookupKey

相关的还有lookupKeyRead,lookupKeyWrite,这几个函数都是表示从某个库里查找相应的key,带写的函数会先判断是否过时;

第一个是redisDb结构,第二个是一个robj*,表示要查找哪一个key;

当前链接的数据库能够经过 c->db来获取。

四、createStringObjectFromLongLong

这些是建立相应类型robj的命令,有的时候咱们要根据一些处理结果返回字符串或数值给客户端,前面讲了大部分函数都接受robj做为参数,像添加内容到输入缓存区的addReply;

其它的命令有:

createStringObject:根据字符串建立robj

createStringObjectFromLongDouble:根据double建立robj

3、调试

你们看完上面代码想本身写个命令呢,按上面讲的基本上能够把环境跑起来,最后就是调试了,能够下个gdb,而后在相应的函数上打断点就能够了,经常使用命令以下:

break 函数名

print 变量名

上面两个命令应该是最经常使用的了,第一个是下断点,第二个是打印变量的值。

扩展Redis:增长Redis命令

如何作好稳定性

BoneCP链接池重连机制分析

Mysql中间件360 Atlas踩坑

从RabbitMQ Channel设计看链接复用

相关文章
相关标签/搜索