前言
以前做过一个有关redis的技术分享,这里将之前分享的内容做了抽减,来大概的介绍一下redis,以帮助快速入门,对redis有个概要性的了解,不会做深入的介绍。本文中代码由于是直接用以前PPT上的截图,所以没有贴源码,请谅解。
本文内容如有错误的地方,欢迎指正。
Redis是什么?
Redis是完全开源免费、遵守BSD协议的一个高性能的key-value数据库。据官方统计数据:redis读 110000次/秒,写 81000次/秒。目前已经有很多公司都在用redis,下面举几个例子:

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头文件中,其底层是由哈希表构成。