Redis源码剖析
文章平均质量分 89
Redis是支持网络,基于内存并且可持久化的kv型数据库,源码中的数据结构,k-v数据的存储,发布订阅等功能都十分值得学习
一个程序渣渣的小后院
这个作者很懒,什么都没留下…
展开
-
Redis源码剖析(十三)整数集合
Redis提供一种叫整数集合的数据结构,当数据中只包含整数,并且数据数量不多时,Redis便会采用整数集合存储Redis保证整数集合有以下几个特性所含元素全是整数,且不重复内部元素有序,通常是会从小到大排序内部编码统一,尽可能采用合适的编码保存数据当编码不合适时,执行升级操作接下来会针对上述几个特性分别进行分析,可以看到,整数集合有点类似连续数组,只是在某种程度上添加了编码,同时为了编码统原创 2018-01-20 14:18:46 · 302 阅读 · 0 评论 -
Redis源码剖析(十二)有序集合跳表实现
有序集合是Redis对象系统中的一部分,其底层采用跳表和压缩列表两种形式存储,在上一篇介绍了跳表实现,就趁热打铁看一下有序集合的跳表实现本篇主要涉及的是有序集合添加数据的命令,后面会看到,在命令的底层实现中,实际上还是调用跳表的接口存储结构有序集合的定义在server.h文件中,不过除了跳表以外,有序集合又保存了一个字典,这个字典的作用是用来查找某个数据对应的分值。根据跳表的实现可知,跳表内部是采用原创 2018-01-20 11:17:35 · 512 阅读 · 0 评论 -
Redis源码剖析(十一)跳表
在树形结构中,常见的平衡树有AVL树和红黑树,但是由于AVL树过于平衡,导致维护平衡所需的代价过大,使用的不多,不过其中几种旋转算法还是值得学习的。取而代之的是较为平衡的红黑树,STL中的map和set都是采用红黑树实现的,插入和查找效率为O(logN)。而跳表也是一种较为平衡的数据结构,与红黑树不同的是,它是链状结构而非树形结构,不过,跳表的插入查找效率也为O(logN),和红黑树有一拼,而原创 2018-01-10 22:21:36 · 821 阅读 · 2 评论 -
Redis源码剖析(十)简单动态字符串sds
在对象系统概述中发现,好像所有和字符串有关的内容都有sds的存在,实际上,它是Redis内部对于c字符串的封装,所谓c字符串,其实就是char *,在sds.h头文件中可以清楚的看到它的定义//sds.htypedef char *sds;所以创建sds类型变量实际上就是创建了一个char*变量,不过Redis字符串独特的地方在于它记录了字符串的长度。考虑想要计算c原生字符串的长度,原创 2018-01-10 17:16:33 · 325 阅读 · 0 评论 -
Redis源码剖析(九)对象系统概述
在Redis的源码中,到处可见robj类型的变量,在介绍其他模块时,只是将它看成Redis的数据类型,并没有深入探究。而事实上,它是对象系统,提供了对多种类型的封装,Redis可以根据数据的具体形式,采用不同的类型进行存储,一方面提高了灵活性,一方面也为节省内存提供了便利,因为Redis所有的数据都是直接存在内存中的,所以需要想方设法节省内存对象结构redisObject结构中包含原创 2018-01-09 20:45:15 · 277 阅读 · 0 评论 -
Redis源码剖析(八)链表
在之前对Redis的介绍中,可以看到链表的使用频率非常高。链表可以作为单独的存储结构,比如客户端的监视链表记录该客户端监视的所有键,服务器的模式订阅链表记录所有客户端和它的模式订阅。链表也可以内嵌到字典中作为字典的值类型,比如数据库的监视字典使用链表存储监视某个键的所有客户端,服务器的订阅字典使用链表存储订阅某个频道的所有客户端。链表结构节点Redis中的链表是双向链表,即每一个节点都保存了它的前驱原创 2018-01-09 18:21:05 · 302 阅读 · 0 评论 -
Redis源码剖析(七)监视功能
Redis提供这样一个功能,客户端在开启事务之前,可以设置对一个或多个键的监视,在执行EXEC命令之前的这段时间,如果其他客户端对该客户端监视的键做了修改,那么Redis会取消该客户端事务的运行,也就是说如果执行EXEC,那么Redis什么也不会做。由于别的客户端对当前客户端关心的键做了修改,Redis会将当前客户端的事务视为不安全,从而不再执行。Redis设计与实现一书中将监视功能称作乐观锁原创 2018-01-09 15:40:08 · 272 阅读 · 0 评论 -
Redis源码剖析(六)事务模块
Redis允许客户端开启事务模式,在事务模式中,客户端输入的命令不会立即执行而是被保存在事务队列中,只有当客户端输入事务运行命令时,Redis才会将事务队列中的所有命令按照FIFO的顺序一个个执行一个事务从开始到结束通常会经历三个阶段事务开始命令入队事务执行事务命令客户端可以使用MULTI命令开启事务,随后服务器会根据这个客户端输入的不同命令执行不同的操作如果原创 2018-01-06 22:51:43 · 245 阅读 · 0 评论 -
Redis源码剖析(五)订阅与发布
Redis提供了订阅和发布的功能,允许客户端订阅一个或多个频道,当其他客户端向某个频道发送消息时,服务器会将消息转发给所有订阅该频道的客户端这一点有点像群聊的功能,一个客户端将消息发往群中(向某个频道发送消息),所有在群中的客户端(订阅该频道的客户端)都会收到这个消息。事实也正是如此,接下来将会看到,服务器采用字典保存每个频道(键)和订阅该频道的所有客户端(值),每当其他客户端向某个频道发送消原创 2018-01-05 21:21:06 · 542 阅读 · 0 评论 -
Redis源码剖析(四)过期键的删除策略
Redis是支持时间事件的,所谓时间事件,是为某个键值对设置过期时间,时间一到,Redis会自动删除该键值对。例如使用SET命令添加字符串类型的键值对127.0.0.1:6379> SET blog redis ex 10 //添加键值对,10秒后删除OK127.0.0.1:6379> GET blog //添加后马上查找,可以获取redis"redis"127.0.0原创 2018-01-04 22:37:41 · 1026 阅读 · 0 评论 -
Redis源码剖析(三)字典结构的设计与实现
Redis是K-V类型的数据库,所谓K-V类型,就是底层存储的数据结构是key-value,即键key,值value。键key在Redis中以字符串的形式存在,而值value可以是多种类型Redis内部的键值对采用字典存储,而字典底层又采用哈希表实现。哈希表是常用的键值对存储结构,根据键key计算哈希值,然后计算索引下标,在哈希表中对应下标处存储键key对应的值。因为不同key被映射到同一个下原创 2018-01-04 19:21:54 · 593 阅读 · 0 评论 -
Redis源码剖析(二)io多路复用函数及事件驱动流程
作为服务器监听客户端请求的方法,io多路复用起到了不可忽略的作用,利用io复用监听的方法叫Reactor模式,在前一篇也提到过,使用io复用是现在常用的提高并发性的方法,而且效果显著。通常io多路复用连同事件回调是一起出现的,在将文件描述符(套接字)注册到io多路复用函数中时,同时也需要保存当这个文件描述符被激活时调用的函数(称作回调函数),这样,使用者无需考虑何时事件被激活又何时调用相应处理原创 2018-01-04 13:36:23 · 2075 阅读 · 2 评论 -
Redis源码剖析(一)服务器与客户端交互流程
Redis中的C/S模型Redis底层还是基于网络请求的,对于单机数据库而言,网络请求仅仅是在一台机器上交互,即服务器客户端都在一台计算机上当在终端输入redis-serve时,便启动了一个Redis服务器,随后开始初始化内部数据,对于Redis而言包括读取配置文件初始化内部参数创建默认数据库(默认为16个)创建监听套接字并绑定回调函数(接收客户端连接请求)执行事件驱动循环,开始响应客户端请原创 2018-01-04 00:50:39 · 1437 阅读 · 0 评论