Redis
文章平均质量分 61
我不是攻城狮
越努力越幸运
展开
-
Redis主从切换(单点故障)解决源码
初始化发布命令,往pubsub_channels添加channel和对应的客户端列表。hash key存储了channel名称,value存储了订阅者列表。2、从redis架构去思考,拓展哨兵、master、salve都相对简单容易,2、高频次访问发布消息,容易阻塞挤压,说白了还是Reactor单线程驱动缺点。1、采用Reactor事件单线程去驱动发布订阅事件的,从pubsub_channels适配channel对应的订阅者列表。,redis只管发送消息,不会等待订阅该频道的实例响应。原创 2023-12-26 18:29:40 · 524 阅读 · 0 评论 -
Redis哨兵源码分析
在Redis server启动过程中,实现了实例化和初始化。原创 2023-12-22 23:04:06 · 499 阅读 · 0 评论 -
Redis 主从复制源码分析
前置学习:Redis server启动源码-CSDN博客原创 2023-12-05 17:04:01 · 610 阅读 · 0 评论 -
Redis AOF源码解析
本文取3.0版本分析(各个版本差异很大,4.0以上才有aof和rdb混合模式)原创 2023-12-05 17:03:30 · 610 阅读 · 0 评论 -
Redis rdb源码解析
3,主从复制-->startBgsaveForReplication函数,落盘方式(rdbSaveBackground函数),不落盘方式(rdbSaveToSlavesSockets函数)。2、执行bgsave命令--->rdbSaveBackground函数或者(serverCron->prepareForShutdown)4、flushall命令--->flushallCommand函数。1、执行save命令--->rdbSave函数。原创 2023-12-05 17:02:33 · 536 阅读 · 0 评论 -
Redis Reactor事件驱动模型源码
文件事件结构*/// 监听事件类型掩码,// 值可以是 AE_READABLE 或 AE_WRITABLE ,// 或者 AE_READABLE | AE_WRITABLEint mask;// 读事件处理器// 写事件处理器// 多路复用库的私有数据* 已就绪事件*/// 已就绪文件描述符int fd;// 事件类型掩码,// 值可以是 AE_READABLE 或 AE_WRITABLE// 或者是两者的或int mask;/** 事件状态*/原创 2023-12-05 15:48:46 · 616 阅读 · 0 评论 -
Redis server启动源码
初始化数据库数据结构和pool,网络交互初始化(线程初始化、工作队列初始化)包括设置 server 运行的时区、设置哈希函数的随机种子。src/redis.c文件main函数。解析options,加载配置文件。原创 2023-12-05 00:17:01 · 505 阅读 · 0 评论 -
Redis skiplist源码解析(支持范围查询)
跳表是一个多层的有序链表,在跳表中进行查询操作时,查询代码可以从最高层开始查询。层数越高,结点数越少,同时高层结点的跨度会比较大。因此,在高层查询结点时,查询一个结点可能就已经查到了链表的中间位置了。这样一来,跳表就会先查高层,如果高层直接查到了等于待查元素的结点,那么就可以直接返回。如果查到第一个大于待查元素的结点后,就转向下一层查询。下层上的结点数多于上层,所以这样可以在更多的结点中进一步查找待查元素是否存在。原创 2023-12-04 16:57:08 · 436 阅读 · 0 评论 -
Redis quicklist源码+listpack源码(6.0+以上版本)
ziplist设计上的问题,每一次增删改都需要计算前面元素的空间和长度(prevlen),这种设计缺陷非常明显,一旦其中一个entry发生修改,以这个entry后面开始,全部需要重新计算prevlen,因此诞生了连续更新的性能问题。原创 2023-12-04 00:15:05 · 494 阅读 · 0 评论 -
Redis ziplist源码解析
更新或者删除某元素时,需要重新计算所需空间大小并且重新分配所需要的空间,性能肯定是不行的。详细请看下面ziplist增加元素的做法,一个 ziplist 元素包括了 prevlen(编码需要改变)、encoding 和实际数据 data 三个部分。|<-前一项长度 ->|<-当前编码->|<-存储的数据 ->|查找一块连续内存区域,当储存的元素过多时,需要从头到尾去遍历,每一个entry都需要编码过程,十分耗时。entry存储的键值对会根据数据进行转码,尝试转化为整数编码,这样可以节省更多的空间。原创 2023-12-03 19:57:40 · 454 阅读 · 0 评论 -
Redis hash表源码解析
2、当迁移完成后,ht[1]表供正常使用,ht[0]表指向空。如果还需要迁移,那么ht[0]表就会变成rehash那张表,ht[1]就会供正常使用。1、ht[0]供正常使用,ht[1]供rehash使用,从ht[0]迁移到ht[1]会从新计算hash位置,操作粒度是bucket级别。rehash是由ht[0]和ht[1]两个hashTable组成的,操作的粒度是hash表里面的bucket组成的。dictRelace:用来往 Hash 表中添加一个键值对,或者键值对存在时,修改键值对。原创 2023-12-03 00:42:05 · 608 阅读 · 0 评论 -
Redis SDS 源码
底层数据结构的好处:常用命令: set key value、get key 等应用场景:共享 session、分布式锁,计数器、限流。typedef char *sds;2、创建sds字符串并且分配空间3、sds字符串的追加 3-1、扩容详细 4、SDS 类型sdshdr5、sdshdr8、sdshdr16、sdshdr32、sdshdr64 5种结构体类型,设计是一样的,字符数组现有长度 len 和分配空间长度 alloc是不一样的。原创 2023-12-02 15:02:16 · 453 阅读 · 0 评论 -
Redission分布式锁加锁解锁获取锁源码分析
原理:前置学习:Redis发布订阅模式,学不会别来。原创 2023-04-11 16:31:24 · 664 阅读 · 0 评论 -
redis切片集群
原理,在redis集群中,一个切片集群共有 16384 个哈希槽(2^14),每个redis key会根据 crc16(key,keylen) & 0x3FFF;来计算哈希槽位均匀分布到各个主库中,主库会同步写到从库中去。新增实例或者删除redis实例的时候,无须下线,会重新进行分片计算哈希槽位。原创 2023-03-18 18:24:22 · 106 阅读 · 0 评论 -
redis淘汰策略
noeviction 默认策略,不淘汰数据;大部分写命令都将返回错误(DEL等少数除外)volatile-lru 从设置了过期时间的数据中根据 LRU 算法挑选数据淘汰。volatile-ttl 从设置了过期时间的数据中,挑选越早过期的数据进行删除。volatile-random 从设置了过期时间的数据中随机挑选数据淘汰。allkeys-lru 从所有数据中根据 LRU 算法挑选数据淘汰。allkeys-random 从所有数据中随机挑选数据淘汰。原创 2023-03-18 17:56:54 · 54 阅读 · 0 评论 -
缓存穿透、缓存击穿、缓存雪崩
1、要访问的数据既不是Redis缓存中也不再数据库中,导致请求在访问缓存时,发生缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据。1、数据保存在缓存中,并设置了过期时间时,如果某一时刻,大量数据同时过期,此时,应用程序再访问这些数据的话,就会发生缓存缺失。3、如果应用的并发请求量很大,那么数据库的压力也就很大,这回进一步影响到数据库的其他业务请求处理,进而导致数据库崩溃。2.使用布隆过滤器快速判断数据是否存在,避免从数据库中查询数据是否存在,减轻数据库压力。4、Redis缓存主从集群。原创 2023-03-18 17:30:34 · 505 阅读 · 0 评论 -
Redis复合数据结构
ziplist满足以下条件:有序集合保存的个数小于128个,有序集合保存所有元素成员的长度小于64字节。linkedlist:双端链表,每个节点都保存一个字符串对象,每个字符串都保存一个列表元素(哈希对象、集合对象、有序集合对象)集合对象保存所有的元素都是整数值,集合对象保存的元素数量不超过512个。ziplist(压缩列表)、linkedlist(链表)组成的数据结构。应用场景:共享 session、分布式锁,计数器、限流。ziplist(压缩列表)原创 2022-12-28 21:31:17 · 86 阅读 · 0 评论