Redis实现原理知识总结

一、数据结构

1.简单动态字符串SDS

rdis没有直接使用C语言传统的字符串类型,而是自己构建了一种简单动态字符串SDS的类型,原因:
1.常数复杂度获取字符串长度
2.修改的时候会重新计算所需的空间,拒绝溢出
3.减少了内存分配,free记录空间字节数
4.二进制安全,可以保存二进制数据
5.兼容部分C字符串

2.链表:

双向链表

3.字典dict

1.使用哈希表作为底层实现,每个字典使用两个哈希表,一个平时使用,一个rehash时使用。
2.使用链地址法来解决键冲突,一个索引上的多个键值对使用单链表链接。
3.渐进式rehash到另外一个哈希表

4.跳跃表

1.跳跃表是有序集合的底层实现之一
2.redis跳跃表由zskiplist和zskiplistNode两个结构组成,zskilist用于保存跳跃表信息(比如表头节点、表位节点、长度),而zskiplistnode用于跳跃表节点
3.每个跳跃表的节点的层高都是1至32之间随机数。
4.同一跳跃表,多个节点分值可以相同,但节点的成员对象必须是唯一的
5.节点按照分值大小排序,分值相同,则按照对象的大小排序

5.整数集合

整数集合是集合键的底层实现之一

6.压缩列表

一种为节约内存儿开发的顺序数据结构

二、对象

image.png

1.字符串对象

字符串对象的编码可以是int、raw、embstr


image.png

1.int:字符串保存的是整数值,并且可以用long类型来标识


image.png

2.embstr:保存小于32字节的字符串,只读修改后转换成int或者embstr


image.png

3.raw使用SDS来保存


image.png

2.列表对象

列表对象的编码可以是压缩列表zipList或者双端链接linkedlist
当满足以下两个条件时,使用ziplist编码:
1.列表对象保存的所有字符串元素长度小于64
2.元素的个数小于512个

1.ziplist使用压缩列表来作为底层实现


image.png

2.linkedlist使用双端链接作为底层实现


image.png

3.哈希对象

哈希对象编码可以是压缩列表ziplist或者字典hashtable
当哈希对象满足以下两个条件时,哈希对象使用ziplist编码
1.哈希对象所有键值对键和值的字符串长度都小于64字节
2.哈希对象所有键值对的个数小于512个

1.哈希对象使用压缩列表ziplist作为实现


image.png

image.png

2.hashtable使用字典作为实现


image.png

4.集合对象

集合对象编码可以是整数集合intset或者字典hashtable
当集合对象可以同时满足以下两个条件时,使用整数集合intset作为实现:
1.集合对象保存的所有元素是整数时
2.集合元素的数量小于512个

1.集合对象使用整数集合intset作为实现


image.png

1.集合对象使用整数集合字典hashtable作为实现,键为字符串集合元素,值则为null


image.png

5.有序集合对象

有序集合对象编码可以是压缩列表ziplist或者跳表skiplist
当有序集合对象可以同时满足以下两个条件时,使用整数集合ziplist作为实现
1.有序集合保存的元素数量小于128个
2.有序集合保存的所有元素成员的长度小于64字节

1.有序集合对象使用压缩列表ziplis作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点为元素的成员member,第二个元素则保存元素的值score,元素并按照从小到大的排序

image.png

image.png

2.有序集合使用跳跃表skiplist作为底层实现


image.png

三、数据库实现

1.过期删除策略:Redis采用惰性删除和定期删除实现

1.定时删除:在设置过期时间的时候,创建一个定时器timer,让定时器在键的过期时间来临时,立即执行对键的删除操作
2.惰性删除:每次获取键的时候,判断是否过期,过期则删除。
3.定期删除:每间隔一段时间,程序就对数据库进行一次检查,删除过期键

2.持久化RDB和AOF

RDB:
1.保存数据库所有键值对数据,经过压缩生成二进制文件
2.通过SAVE或BGSAVE命令执行保存操作,SAVE会阻塞服务器,BGSAVE通过子进程执行保存不会阻塞
AOF(append only file ):
1.通过保存所有修改数据库的写命令请求来记录数据库的状态
2.命令先写到AOF缓冲区,然后定期的同步到AOF文件
3.AOF重写通过BGREWRITEAOF命令重新读取数据库中键值对来生成一个体积更小的AOF文件
4.执redis会维护一个AOF重写缓冲区,会记录子进程在执行行BGREWRITEAOF命令重写AOF文件期间记录所有数据库写命令,并在重写完成后追加到新的AOF文件中

3.事件

Redis服务器是一个事件驱动程序:文件事件处理服务器与客户端的通信,时间时间处理服务器中的定时操作,例如serverCron函数

1.文件事件处理器采用I/O多路复用程序同事监听多个套接字,并根据套接字目前执行的任务来关联不同的文件处理器
2.I/O多路复用程序总是会将产生文件事件的套接字放在一个队列里面,以有序、同步、每次一个套接字的方式向文件事件套接字传送套接字


image.png

文件事件分派期根据I/O多路复用程序传来的套接字产生的事件类型调用相应的处理器
3.服务器轮流处理文件事件和时间事件,时间事件的处理会比设定到达的时间要晚一些

四、多机数据库的实现

1.主从复制

在redis中,用户通过执行SLAVEOF命令或者设置slaveof选项,让一个从服务器去复制一个主服务器,称为主从复制

阶段一 :同步
1.从服务器发送SYNC命令给主服务器,主服务器执行BGSAVE命令生成RDB文件,并通过缓冲区记录期间的写命令
2.主服务器BGSAVE命令执行完后,将生成的RDB文件发送给从服务器,从服务器载入RDB文件
3.主服务器将缓冲区的所有写命令发送给从服务器,至此主从服务器状态一致

阶段二 :命令传播
主服务器将接受到写命令传播发送给从服务执行,使数据保持一致。命令传播阶段,从服务器会以每秒一次的频率发送心跳消息。

redis2.8版本后使用PSYNC命令的完整重同步、部分重同步优化主从断线后的同步问题:
1.完整重同步和SYNC执行的步骤一样
2.部分重同步,主服务器维护一个复制积压缓冲区,从服务重连后通过PSYNC命令发送复制偏移量,主服务器判断丢失的数据在复制积压区的范围内,则进行部分重同步,将缓冲区的命令发送给从服务器

2.sentinel哨兵

sentinel哨兵是Redis实现高可用的解决方案:由一个或者多个sentinel实例组成的sentinel系统可以监控任意多个主服务器,以及这些主服务器下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线的主服务器下的某个从服务器升级为新的主服务器


image.png

1.sentinel本质上是一个运行在特殊模式下的Redis服务器
2.sentinel将成为主服务器的客户端,可以向主服务器发送命令
3.sentinel会创建两个连向主服务器的连接:命令连接(用来发送命令)、订阅连接
4.sentinel默认会以每十秒一次的频率向主服务器发送info命令,获取主服务器的信息及其下从服务器的信息,并创建两个连向从服务器的连接:命令连接(用来发送命令)、订阅连接,通过每十秒一次的频率向从服务器发送info命令,获取从服务器的信息
5.sentinel默认会以两秒一次的频率通过命令连接向所有监视的主服务器和从服务器的sentinel:hello频道发送一条消息,消息内容包含sentinel自身信息以及主服务器信息,其他监听此频道的sentinel会解析消息,来更新主服务器信息以及sentinel系统信息,并创建向其他sentinel的命令连接,组成sentinel互联的网络

下线:
1.sentinel默认会以每秒一次的频率向它创建的了命令连接的实例(主服务器、从服务器、其他sentinel)发送ping命令判断是否在线
2.sentinel发现实例下线会被sentinel标记为主观下线,多个sentinel配置的下线时长可能不一致
3.sentinel发现主服务器主观下线后,发送命令询问其他sentinel是否也判断此主机为主观下线,当从其他sentinel接受到足够多的下线判断后,sentinel将从服务器标记为客观下线,并对主服务器执行故障转移工作
4.sentinel选举领头sentinel对下线服务器进行故障转移工作。


image.png
image.png

3.Redis集群

redis集群是redis分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容