Redis源码分析与思考
用来展示博主对redis源码的思考与分析,当然难免会有些不足之处,欢迎大家的指出
suye233
穷变
展开
-
redis源码分析与思考(十九)——AOF持久化
AOF持久化是redis保存数据的另外一种方式,全称Append Only File,与RDB持久化不同的是,AOF持久化是只保存从客户端键入的命令,而RDB持久化是单纯的保存数据。 AOF持久化的实现分为3个步骤:写入缓冲区、缓冲区写入文件、缓冲区文件同步原创 2018-10-18 22:22:41 · 254 阅读 · 0 评论 -
redis源码分析与思考(十八)——RDB持久化
redis是一个键值对的数据库服务器,服务器中包含着若干个非空的数据库,每个非空数据库里又包含着若干个键值对。因为redis是一个基于内存存贮的数据库,他将自己所存的数据存于内存中,如果不将这些数据及时的保存在硬盘中,当电脑关机或者进行清除内存的操作时,redis保存的数据一定会发生丢失的状况,这对于数据库来说,是一个灾难性的问题。为了解决这个问题,...原创 2018-10-18 20:53:23 · 251 阅读 · 0 评论 -
redis源码分析与思考(十七)——有序集合类型的命令实现(t_zset.c)
有序集合是集合的延伸,它保存着集合元素的不可重复性,但不同的是,它是有序的,它利用每一个元素的分数来作为有序集合的排序依据,现在列出有序集合的命令:有序集合命令命令对应操作时间复杂度zadd key score member [score member…]添加成员O(n)zcard key计算成员个数O(1)...原创 2018-10-17 21:16:14 · 365 阅读 · 0 评论 -
redis源码分析与思考(十六)——集合类型的命令实现(t_set.c)
集合类型是用来保存多个字符串的,与列表类型不一样,集合中不允许有重复的元素,也不能以索引的方式来通过下标获取值,集合中的元素还是无序的。在普通的集合上增删查改外,集合类型还实现了多个集合的取交集、并集、差集,集合的命令如下表所示:集合命令表命令对应操作时间复杂度sadd key element [element…]添加元素...原创 2018-10-17 20:52:19 · 197 阅读 · 0 评论 -
redis源码分析与思考(十五)——哈希类型的命令实现(t_hash.c)
哈希类型又叫做字典,在redis中,哈希类型本身是一个键值对,而哈希类型里面也存贮着键值对,其对应关系是,每个哈希类型的值对应着一个键值对或多对键值对,如图所示:...原创 2018-10-17 20:03:00 · 361 阅读 · 0 评论 -
redis源码分析与思考(十四)——列表类型的命令实现(t_list.c)
列表类型是用来存贮多个字符串对象的结构。一个列表可以存贮2^32^-1个元素,可以对列表两端进行插入(push)、弹出(pop),还可以获取指定范围内的元素列表、获取指定索引的元素等等,它可以灵活的充当栈和队列的角色原创 2018-10-17 19:45:45 · 297 阅读 · 0 评论 -
redis源码分析与思考(十三)——字符串类型的命令实现(t_string.c)
在对字符串操作的命令中,主要有增加删查该、批处理操作以及编码的转换命令,现在列出对字符串对象操作的主要常用命令原创 2018-10-17 12:06:23 · 288 阅读 · 0 评论 -
redis源码分析与思考(十二)——时间事件
redis的时间事件分为两大类,定时事件与周期事件。它们主要来处理那些需要周期或者定时来实现的一些功能,比如服务器需要隔段时间来处理自身的状态等等原创 2018-10-14 21:42:41 · 401 阅读 · 0 评论 -
redis源码分析与思考(十一)——文件事件机制(服务端与客户端的通信机制)
redis服务器是一个典型的事件驱动程序,客户端产生命令通过套接字来与服务端进行通信,而服务端通过套接字来返回对应的响应来给客户端。服务端主要处理两大类事件:文件事件:文件事件是服务端对套接字通信的抽象,表示着服务端与客户端通信产生一系列的操作。时间事件:服务端需要定时的检查自身的状态,以及一些函数需要定时的运行,由这些产生的操作的抽象即为时间...原创 2018-10-13 18:27:32 · 248 阅读 · 0 评论 -
redis源码分析与思考(十)——数据库键的删除策略与遍历策略
在这里我们应当仔细思考键的删除策略,因为redis是单线程架构,如果删除键时占用了大量的时间的话,便会是整体的性能变差,而redis中同时采取了两种策略,一种是惰性删除策略,也就是上文提到的,Redis进行读写操作时,都会检查该键是否过期,过期则删除,这种策略有时会造成严重的内存泄露;而另一种策略是定期删除原创 2018-10-12 18:36:59 · 232 阅读 · 0 评论 -
redis源码分析与思考(九)——数据库结构以及基本命令的实现
在数据库的定义中可以看到,dict字典保存着所有的键值对,也就是说,redis保存所有的数据都保存在dict字典中,dict中键保存着所有的键对象,也就是字符串对象,而dict中值保存着字符串对象、列表对象、哈希对象、集合对象以及有序集合对象。之所以采用字典来保存所有的键,是因为它查找键的时间复杂度为O(1)。原创 2018-10-11 12:25:39 · 193 阅读 · 0 评论 -
redis源码分析与思考(八)——对象
谈及对象,我们不免会立即联想到Java、C++等面向对象的语言,而在C中是没有对象这一说法的,为了方便管理与代码整体的优化,redis基于前面几篇博客的数据结构自建了一套对象系统。这个系统包含着字符串对象、列表对象、哈希对象、集合对象以及有序集合对象。构建这一对象系统最为直接的好处就是该对象可以根据不同的场景去使用不同的数据结构来实现,提高了效率。原创 2018-10-10 19:05:51 · 421 阅读 · 0 评论 -
redis源码分析与思考(七)——压缩列表
ziplist,即压缩列表。在Redis中,它是为了尽量节约内存而开发出来的,可谓是将节约内存做到了极致。它是哈希键与列表键的底层实现之一,当哈希键与列表键只含有整数或者两者的键长度较小时,两者就采用压缩列表来实现其功能。原创 2018-10-08 19:45:50 · 287 阅读 · 1 评论 -
redis源码分析与思考(六)——整数集合
intset,即整数集合。整数集合是Redis集合键的底层实现之一,当集合中只函数整数元素,且整数元素个数不多时,Redis会采用整数集合来实现集合键。原创 2018-09-29 21:04:31 · 190 阅读 · 0 评论 -
redis源码分析与思考(五)——跳跃表
在计算机科学领域,跳跃链表是一种数据结构,允许快速查询一个有序连续元素的数据链表。快速查询是通过维护一个多层次的链表,且每一层链表中的元素是前一层链表元素的子集。一开始时,算法在最稀疏的层次进行搜索,直至需要查找的元素在该层两个相邻的元素中间。这时,算法将跳转到下一个层次,重复刚才的搜索,直到找到需要查找的元素为止。原创 2018-09-27 17:41:14 · 201 阅读 · 0 评论 -
redis源码分析与思考(四)——字典遍历与reverse binary iteration算法
在进行字典的遍历时,有着许多的问题去解决。最难处理的点就是如何在rehash的途中有效率的、不遗漏的遍历全部的哈希节点,因为在此时每个哈希节点的地址与索引都是不确定的。在Redis中,其作者基于reverse binary iteration算法来实现的,直译过来就是反转二进制迭代算法,而且实现的非常精妙,Redis之父==Salvatore Sanfilippo==对其的评价是” Hard to explain but awesome.”原创 2018-09-25 21:52:42 · 796 阅读 · 0 评论 -
redis源码分析与思考(三)——字典中键的两种hash算法
在Redis字典中,得到键的hash值显得尤为重要,因为这个不仅关乎到是否字典能做到负载均衡,以及在性能上优势是否突出,一个良好的hash算法在此时就能发挥出巨大的作用。而一个良好的hash算法往往倾向于把不同的实例分配在不同的散列值上。在Redis中,实现键的哈希值有两种算法实现,一种是djb2算法,另一种就是MurmurHash2算法。原创 2018-09-23 18:14:29 · 487 阅读 · 0 评论 -
redis源码分析与思考(二)——链表与字典
链表 关于链表,我们并不陌生,在数据结构里早已接触过,所以在这只是简单的描述下Redis中链表的一些特征。在Redis中,使用链表作为列表键的底层实现之一,而且在发布与订阅、慢查询等功能上也用到了链表。 链表的定义与实现是在adlist.h与adlist.c两个文件中,先看Redis中链表的节点与链表本身的定义://链表节点typedef struct listNode {...原创 2018-09-21 11:36:58 · 232 阅读 · 0 评论 -
redis源码分析与思考(一)——sds
在阅读黄健宏的书《Redis设计与实现》的时候,深刻的意识到仅仅看别人的作品是远远不够,自己更应该去阅读源码,形成自己的思考,这样才算真正的学进去了。 现如今,Nosql的概念大行其道,redis作为其中的佼佼者被广大的开发者爱好着,而且Redis的源码仅仅只有三万多行,作为一名喜爱开源技术以及新技术的人来说,Redis源码无疑是值得每个开发者阅读的。 在Redis中,即使源码是由...原创 2018-09-18 18:21:12 · 328 阅读 · 1 评论