以下涉及到的源码均为redis5.0-rc3版本的代码【点击查看官方源码】
服务器结构
在redis的头文件server.h中定义了服务器的数据结构,略见如下:(详细的可在文末的源码部分见得)
1 | struct redisServer { |
A thousand miles begins with a single step .
以下涉及到的源码均为redis5.0-rc3版本的代码【点击查看官方源码】
在redis的头文件server.h中定义了服务器的数据结构,略见如下:(详细的可在文末的源码部分见得)
1 | struct redisServer { |
以下涉及到的源码均为redis5.0-rc3版本的代码【点击查看官方源码】
Redis执行命令时都会先建立一个客户端,然后由客户端去和服务器连接,在执行命令(使用lua脚本执行亦如此,只不过lua的客户端是个伪客户端而已)。redis的命令执行中有一个核心部分,就是call()方法,call函数声明如下:
1 | void call(client *c, int flags) |
可见有两个参数,client是代表客户端(redis的命令执行都是以客户端向服务端发送的方式,请求执行的一方即为客户端);flags是一个特殊标识。
以下涉及到的源码均为redis5.0-rc3版本的代码【点击查看官方源码】
Redis服务器初始化数据库的个数为16个,由server.h头文件中的宏定义而来,如下所示:
1 | #define CONFIG_DEFAULT_DBNUM 16 |
并且每个数据库的结构都有一个redisDb构成,如下是redisDb的数据结构定义(server.h头文件中),各字段的含义可见上面的源码注释:
以下涉及到的源码均为redis5.0-rc3版本的代码【点击查看官方源码】
在redis服务器中,对命令进行了结构封装,如下所示(server.h头文件中):
1 | struct redisCommand { |
以下涉及到的源码均为redis5.0-rc3版本的代码【点击查看官方源码】
在redis中,定义了5中基本对象,分别为string、list、set、zset、hash。而为了方便管理与操作,redis又对这5种对象进行了一次外围封装,如下所示(server.h头文件):
1 | typedef struct redisObject { |
以下涉及到的源码均为redis5.0-rc3版本的代码【点击查看官方源码】
以下涉及到的源码均为redis5.0-rc3版本的代码【点击查看官方源码】
以下涉及到的源码均为redis5.0-rc3版本的代码【点击查看官方源码】
整数集合(intset),故名思意,是存放整数的集合数据结构,从而可知其是集合(Set)的底层实现之一。而从源码中可知,整数集合中的元素又是从小到大来排序的。
整数集合的定义在源码头文件intset.h中,如下所示:
1 | typedef struct intset { |
以下涉及到的源码均为redis5.0-rc3版本的代码【点击查看官方源码】
字典是一个key-value形式的数据结构,使用过java中map结构的都应该了解,因为其也是字典;而了解哈希表的也应该不会陌生,因为字典的底层就是哈希表。而redis本身就是一个key-value形式的nosql数据库,足以见得字典结构在redis中的地位。
字典的定义是在redis源码中的dict.h头文件中,其底层是由哈希表构成。
以下涉及到的源码均为redis5.0-rc3版本的代码【点击查看官方源码】
简单动态字符串(simple dynamic string),是redis底层为字符串而设计的一种数据结构,是针对C字符串的一个改良版。凡是涉及到需要修改的字符串均采用sds来存储,而非C字符串。