
Redis
文章平均质量分 95
S_H-A_N
这个作者很懒,什么都没留下…
展开
-
【Redis】基础数据结构-quicklist
/ 头指针// 尾指针/* 列表中的元素总个数,也就是所有ziplist中包含的元素数量之和 *//* 链表中节点的个数 *//* 表示ziplist的大小 */0=off */head:指向头结点的指针tail:指向尾节点的指针count:列表中的元素总个数,等于所有节点的ziplist中包含的元素数量之和len:quicklist中quicklistNode节点的个数数值含义-1表示ziplist的字节数不能超过4KB-2。原创 2023-10-06 10:55:03 · 926 阅读 · 0 评论 -
【Redis】基础数据结构-skiplist跳跃表
跳跃表的结构定义header:指向跳跃表中节点的头指针,跳跃表中的节点定义为zskiplistNode,跳跃表实际上也是一个链表,所以会有一个头结点tail:指向跳跃表中节点的尾指针length:跳跃表中节点的数量level:跳跃表的层级// 跳跃表// 指向跳跃表的头尾指针// 长度// 层级int level;节点的结构定义ele:一个sds类型的变量,存储实际的数据score:存储数据的分值,跳跃表就是按照这个分值进行排序的。原创 2023-10-05 13:36:40 · 294 阅读 · 0 评论 -
【Redis】基础数据结构-ziplist压缩列表
(1)Redis压缩列表使用了一块连续的内存,来节约内存空间。(2)压缩列表的节点可以存储字符串或者整数类型的值,它采用了变长的编码方式,根据数据类型的不同以及数据长度的不同,选择不同的编码方式,每种编码占用的字节大小不同,以此来节约内存。(3)压缩列表的每个节点中存储了前一个节点的字节长度,如果知道某个节点的地址,可以使用地址减去字节长度定位到上一个节点,不过新增节点的时候,由于前一个节点的长度大于254使用5个字节,小于254使用1个字节存储,在一些极端的情况下由于长度的变化会引起连锁更新。原创 2023-10-04 10:03:26 · 239 阅读 · 0 评论 -
【Redis】基础数据结构-字典
Redis字典底层使用哈希表实现。键值对放入哈希表的时候,会根据key的值,计算hash值,出现哈希冲突的时候,Redis采用链式哈希解决冲突,使用链表将这些冲突的元素链起来。由于Redis采用链式哈希解决冲突,那么在冲突频繁的场景下,链表会变得越来越长,这种情况下查找效率是比较低下的,需要遍历链表对比KEY的值来获取数据,为了处理效率低下的问题,需要对哈希表进行扩容,扩容的过程称为rehash。原创 2023-10-03 22:10:49 · 324 阅读 · 0 评论 -
【Redis】基础数据结构-简单动态字符串SDS
C语言中使用char*字符数组表示字符串,'\\0'来标记一个字符串的结束,不过在使用的过程中我们不需要显式的在字符串中加入'\0'。存在问题**1.二进制安全**C语言以'\0'标记字符串的结尾,如果一个字符串本身带有'\0',比如一些二进制数据,那么字符串就会被截断,导致无法存储二进制数据。原创 2023-10-02 10:21:53 · 246 阅读 · 0 评论 -
【Redis】Redis Cluster-集群数据迁移
Redis通过对KEY计算hash,将KEY映射到slot,集群中每个节点负责一部分slot的方式管理数据,slot最大个数为16384。在集群节点对应的结构体变量clusterNode中可以看到slots数组,数组的大小为CLUSTER_SLOTS除以8,CLUSTER_SLOTS的值是16384:clusterStateclusterNode里面保存了节点相关的信息,集群数据迁移信息并未保存在clusterNode中,而是使用了clusterState结构体来保存:clusterState与cl原创 2022-06-21 23:11:27 · 3148 阅读 · 0 评论 -
【Redis】集群请求命令处理
在Redis的命令处理函数(server.c)中有对集群节点的处理,满足以下条件时进入集群节点处理逻辑中:条件三的判断条件有些绕,意味着命令中没有key参数,表示当前命令不是EXEC,然后对整体做了取反操作,那么看以下两种情况:MULTI命令的处理上面说到,如果是命令时,也会进入到集群节点处理逻辑,命令一般与结合使用,用于执行事务。比如以下例子中,使用开启事务,执行对a账户增1,b账户减1的操作,可以看到返回结果为,命令被缓存起来,直到执行命令,Redis才开始提交命令:由于集群也需要对命令处理,所以原创 2022-06-18 13:11:01 · 1153 阅读 · 0 评论 -
【Redis】集群故障转移
Cluster消息类型定义在Redis初始化服务initServer函数中,调用aeCreateTimeEvent注册了时间事件,周期性的执行serverCron函数,在serverCron中可以看到每隔100ms调用一次clusterCron函数,执行Redis Cluster定时任务:clusterCronclusterCron是集群相关的定时执行函数,每100ms执行一次:clusterNodeclusterNode是集群中节点对应的结构体,包含了以下内容:clusterLinkConnect原创 2022-06-16 22:02:15 · 1891 阅读 · 0 评论 -
【Redis】Redis Cluster初始化及PING消息的发送
Cluster消息类型定义在Redis初始化服务initServer函数中,调用aeCreateTimeEvent注册了时间事件,周期性的执行serverCron函数,在serverCron中可以看到每隔100ms调用一次clusterCron函数,执行Redis Cluster定时任务:clusterCronclusterCron是集群相关的定时执行函数,每100ms执行一次:clusterNodeclusterNode是集群中节点对应的结构体,包含了以下内容:clusterLinkConnect原创 2022-06-16 21:59:54 · 1448 阅读 · 1 评论 -
【Redis】客观下线
sentinelCheckObjectivelyDownsentinelCheckObjectivelyDown函数用于判断master节点是否客观下线:可以看到,master节点客观下线需要根据其他哨兵实例对主节点的判断来共同决定,具体是通过其他哨兵实例的flag中是否有SRI_MASTER_DOWN状态来判断的,如果认为master下线的哨兵个数超过了master节点中的quorum...原创 2022-06-07 09:28:31 · 1415 阅读 · 0 评论 -
【Redis】哨兵初始化和主观下线
在的redis启动函数main(server.c文件)中,对哨兵模式进行了检查,如果是哨兵模式,将调用initSentinelConfig和initSentinel进行初始化,initServer函数中会注册哨兵的时间事件,最后调用sentinelIsRunning运行哨兵实例,哨兵初始化哨兵模式校验checkForSentinelModecheckForSentinelMode函数在server.c文件中,用于校验是否是哨兵模式,可以看到有两种方式校验哨兵模式:初始化配置项initSentine原创 2022-06-07 09:26:41 · 1345 阅读 · 0 评论 -
【Redis】网络IO-事件驱动框架源码分析(多线程)
IO线程初始化Redis在6.0版本中引入了多线程,提高IO请求处理效率。在Redis Server启动函数main(server.c文件)中初始化服务之后,又调用了InitServerLast函数:int main(int argc, char **argv) { // ... // 初始化服务 initServer(); // ... // InitServerLast InitServerLast(); // ... // 事件循环原创 2022-05-29 20:10:22 · 1295 阅读 · 0 评论 -
【Redis】网络IO-事件驱动框架源码分析(单线程)
aeEventLoop初始化在server.c文件的initServer函数中,对aeEventLoop进行了初始化:调用aeCreateEventLoop函数创建aeEventLoop结构体,对aeEventLoop结构体中的变量进行了初始化,之后调用了aeApiCreate函数创建epoll实例调用aeCreateFileEvent函数向内核注册监听事件,由参数可知,注册的是对TCP文件描述符的可读事件监听,回调函数是acceptTcpHandler,当内核监听到TCP文件描述符有可读事件时,R原创 2022-05-29 20:07:12 · 385 阅读 · 0 评论