redis设计学习

redis数据类型

redis自定义字符串(SDS)

redis自定义一种字符串SDS(Simple Dynamic String),该字符串数据结构大概定义了字符编码,char []数组存储字节,达到了我们存储字符串和二进制数据的需求,也实现了我们存储不同编码的字符串和二进制图片等数据。区别于C语言中的String,这种字符串起到了一定的优化作用,可以使用C中的一些字符串函数,和自定义SDS的API。

List

由于C中没有双向链表,Redis自己实现了一种双向链表,并做了一定的优化。数据结构如同学习的java中的LinkedList,两个引用类型指向链表的前后存储元素,然后就是一个存储变量存储当前节点的存储值。此种结构也对应了Redis中的相关Api,例如RPUSH,LPUSH,RPOP,LPOP等。Redis做的优化其中一种就是,当存储数据较小,双向链表查询的效率可能就不太理想,将这种List改为ZipList,将物理存储结构连在一起,猜测为类似与数据的概念。

Map

由于C中没有hashtable,Redis自己实现了一种hashtable,hashtable类似与java中的hashMap,内部为hash表,通过数据hash存入hash表中,因为hash存在重复的可能性,在hash表中的子单元通过链表连接起来。

Set

Redis通过hashtable来存储无序数组。Redis其中做的优化是当数据存的全是数值类型,且数量较小时,使用IntSet,实质上内部就是个数值数组。

ZSet

Zset来做有序数组,Redis通过两种数据结构来完成,一种是hashTable,另一种则是跳表。使用过zset的都知道,所谓的有序,是通过设置score来给存入的值排序。Zset的两种存储结构,hashtable负责通过存储的redis值,查询到对应的score。跳表为二叉树的一种变种,感兴趣的可以搜一搜,既然是二叉树,子节点存储的是score,我就可以通过score,完成区域score查询,通过score也可以查询到对应的redis存储的值。

Redis设计结构

事件驱动

redis事件主要分为时间事件和文件时间

  1. 时间时间

    当被监听的套接字准备好执行连接应答、读取、写入、关闭等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件

  2. 文件时间

    时间事件分两类第一类是定时事件(指定时间清除过期字典数据);一类是周期性事件(例如redis周期刷新RDB)

redis程序设计

redisServer粗略的可以分为以下几种功能组成

  1. Socket套接字
  2. I/O多路复用程序
  3. 各种命令处理适配执行程序

设计优点:

  • 单线程的I/O程序
    多线程的I/O就难避免线程切换的开销和I/O资源的竞争,单线程完全避免了这些问题。当执行完命令操作的时候,可能会AOF或RDB持久化,涉及磁盘I/O,会造成中断线程切换,造成开销。多线程I/O会有资源竞争,产生锁。
  • 事件监听机制
    事件机制方便管理,提高执行效率

socket套接字

该功能负责处理RedisClient与RedisServer的链接,将命令传给I/O多路复用程序,然后响应给RedisClient

I/O多路复用程序

i/o多路复用程序会将socket套接字接受到的命令处理后放入到I/O多路复用的命令队列中,命令依次执行,根据不同类型的命令发给不同的命令处理器,等待执行完成后返回给socket套接字,重复执行。

各种命令处理适配执行程序

由于命令处理的程序比较多,我也没看多少,只能说有东西处理吧,然后通过事件回调通过I/O多路复用程序。

redis主从

主要谈谈实现流程吧,有两台无关联的Redis服务器,有一台B向A发起slaveof主从同步命令后,A会将此时的数据写成一个RDB文件(RDB后有描述),然后将此刻以后得所有执行的命令都写入AOF(AOF后又描述),最后将文件传给B,b将RDB和Aof解析,此后每次A数据修改,都会同步给B,主从同步就完成了。

redis哨兵

启动三台redis哨兵,每个哨兵程序会创建两条线程,一条连接单台RedisServer发送命令,一条负责RedisServer订阅哨兵信息,发送命令线程定时向redisServer发送命令监听心跳,一条订阅哨兵消息,会将自身ip端口等信息发给redisServer,并且redisServer会储存下来。当三台redis哨兵都启动成功后,redisServer中也会存储了三台哨兵信息,哨兵在获得其他哨兵信息的时候也会建立一个命令连接线程。自此整个系统也就圈起来了。

当redisserver主挂掉的时候,哨兵就开始发挥作用了,哨兵之间会相互通信以下,每台选举自己做头,然后算出一台相应最快的做头,然后与从redis通信,选从为主。当主断线重连后,作为从连接现在的主。

redis集群

redis集群主要就是针对数据量大,做的一种数据分区,通过对数据分片(槽),将数据分开存储。总共是2的14次方,分别分与不同的redis主服务器中,当redisClient数据请求时,会通过redis的hash算法计算key是否在本服务器中,如果存在就执行操作,不存在则返回重定向给client重行请求到指定服务器。

redis数据备份

redis备份主要分为AOF和RDB两大类

AOF

当数据持久化的时候,将内存中的数据转成对应的redis命令持久化到硬盘中。在下次启动恢复的时候redis会自动检测文件,放入内存。

RDB

当数据持久化的时候,将内存中对的数据直接转成对应的数据格式持久化到硬盘中。在下次启动恢复的时候redis会自动检测文件,放入内存。

posted @ 2023-06-03 17:24  站在巨人肩上的人  阅读(13)  评论(0编辑  收藏  举报