摘要: Redis List 在Redis3.2版之前,Redis使用压缩列表和双向链表作为List的底层实现。当元素个数比较少并且元素长度比较小时,Redis使用压缩列表实现,否则Redis使用双向链表实现。 ziplist存在问题 不能保存过多的元素,否则查找复杂度高,性能降低。 由于每个节点保存了前一 阅读全文
posted @ 2022-06-07 22:19 shanml 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 有序集合Sorted Set zadd zadd用于向集合中添加元素并且可以设置分值,比如添加三门编程语言,分值分别为1、2、3: 127.0.0.1:6379> zadd language 1 java (integer) 1 127.0.0.1:6379> zadd language 2 c++ 阅读全文
posted @ 2022-06-06 22:18 shanml 阅读(175) 评论(0) 推荐(1) 编辑
摘要: 压缩列表 压缩列表是列表和哈希表的底层实现之一: 如果一个列表只有少量数据,并且数据类型是整数或者比较短的字符串,redis底层就会使用压缩列表实现。 如果一个哈希表只有少量键值对,并且每个键值对的键和值数据类型是整数或者比较短的字符串,redis底层就会使用压缩列表实现。 Redis压缩列表是由连 阅读全文
posted @ 2022-06-01 23:15 shanml 阅读(333) 评论(0) 推荐(0) 编辑
摘要: Redis 字典 基本语法 字典是Redis中的一种数据结构,底层使用哈希表实现,一个哈希表中可以存储多个键值对,它的语法如下,其中KEY为键,field和value为值(也是一个键值对): HSET key field value 根据Key和field获取value: HGET key fiel 阅读全文
posted @ 2022-05-31 22:52 shanml 阅读(275) 评论(0) 推荐(0) 编辑
摘要: C语言字符串 char *str = "redis"; // 可以不显式的添加\0,由编译器添加 char *str = "redis\0"; // 也可以添加\0代表字符串结束 C语言中使用char*字符数组表示字符串,'\0'来标记一个字符串的结束,不过在使用的过程中我们不需要显式的在字符串中加 阅读全文
posted @ 2022-05-29 20:00 shanml 阅读(261) 评论(0) 推荐(1) 编辑
摘要: Redis通过对KEY计算hash,将KEY映射到slot,集群中每个节点负责一部分slot的方式管理数据,slot最大个数为16384。 在集群节点对应的结构体变量clusterNode中可以看到slots数组,数组的大小为CLUSTER_SLOTS除以8,CLUSTER_SLOTS的值是1638 阅读全文
posted @ 2022-05-26 23:03 shanml 阅读(867) 评论(0) 推荐(0) 编辑
摘要: 集群请求命令处理 在Redis的命令处理函数processCommand(server.c)中有对集群节点的处理,满足以下条件时进入集群节点处理逻辑中: 启用了集群模式,通过server.cluster_enabled判断 发送命令的节点不是主节点 收到的命令中包含了key参数或者命令是EXEC,E 阅读全文
posted @ 2022-05-26 22:52 shanml 阅读(331) 评论(0) 推荐(0) 编辑
摘要: Cluster消息类型定义 #define CLUSTERMSG_TYPE_PING 0 /* Ping消息类型,节点间进行通信交换信息的消息 */ #define CLUSTERMSG_TYPE_PONG 1 /* Pong消息类型 (Ping命令的回复) */ #define CLUSTERMS 阅读全文
posted @ 2022-05-15 15:12 shanml 阅读(446) 评论(0) 推荐(0) 编辑
摘要: 在sentinelHandleRedisInstance函数中,如果是主节点,需要做如下处理: void sentinelHandleRedisInstance(sentinelRedisInstance *ri) { // 省略... // 如果是主节点 if (ri->flags & SRI_M 阅读全文
posted @ 2022-05-11 23:37 shanml 阅读(73) 评论(0) 推荐(0) 编辑
摘要: 在的redis启动函数main(server.c文件)中,对哨兵模式进行了检查,如果是哨兵模式,将调用initSentinelConfig和initSentinel进行初始化,initServer函数中会注册哨兵的时间事件,最后调用sentinelIsRunning运行哨兵实例, int main( 阅读全文
posted @ 2022-05-03 19:50 shanml 阅读(175) 评论(0) 推荐(0) 编辑