Redis6 分析
文章平均质量分 94
分析redis的部分源码和知识
确实可以
这个作者很懒,什么都没留下…
展开
-
Redis主从、哨兵、cluster集群的部署和细节
哨兵架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过 sentinel代理访问redis的主节点,当redis的主节点发生变化,哨兵会第一时间感知到,并且将新的redis 主节点通知给client端(这里面redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息)当节点删除或者发生宕机时,节点上保存的数据也就丢失,但如果数据绑定的是插槽,那么当出现该情况时候,就可以将故障接的插槽转移到存活节点上。原创 2024-05-23 10:41:33 · 880 阅读 · 0 评论 -
Redis如何避免数据丢失?——RDB
写时复制的核心思想是 若有多个调用者同时请求相同资源,他们会共同获取相同的指针指向相同的资源,直到某个调用者视图修改资源的内容是,系统才会真正复制一个专用副本给该调用者,而其他调用者所见的最初的资源仍然保持不变,而该过程对其他的调用折是透明的,不被感知的。此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被建立,因此多个调用者只是读取操作时可以共享同一份资源。原创 2024-05-10 15:00:12 · 1148 阅读 · 0 评论 -
Redis如何避免数据丢失?——AOF
Redis是把数据储存在内存的键值数据库,而服务器一旦宕机,那内存中的数据将全部丢失。像MySQL那样,是有宕机后数据恢复机制的。那Redis也是有的,其有两种方式:AOF和RDB。该章节讲解AOF。MySQL是使用redo log(重做日志)来进行宕机恢复的。其是使用了写前日志(Write Ahead Log,WAL),即是在实际写数据前,先把修改的数据写到日志文件中,方便出故障时候进行恢复。而AOF正好相反,是。这是个文本日志,不是二进制文件。原创 2024-05-08 11:10:14 · 961 阅读 · 0 评论 -
Redis的事务机制能保证ACID属性吗?
Redis使用 multi、exec、discard、watch 四个命令来支持事务机制。multi:开启一个事务exec:提交事务,从命令队列中取出提交的操作命令,进行实际执行discard: 放弃一个事务,清空命令队列watch:检测一个或多个键的值在事务执行过程中是否发生变化,若发生变化,当前事务就放弃执行Redis的事务机制可以保证一致性和隔离性和一定程度的原子性(不提供回滚),无法保证持久性。原创 2024-04-30 17:17:43 · 1246 阅读 · 1 评论 -
如何保证Redis双写一致性?
1.场景一:并发读写情况下产生的短暂不一致场景,业务场景要能接受。并发读写情况下,缓存正好失效且读操作耗时大于写操作而产生的数据不一致。可以通过延时删除,或者给redis设置较短的存活时间。原创 2024-04-29 14:27:26 · 1314 阅读 · 0 评论 -
Redis网络部分相关的结构体2 和 绑定回调函数细节
创建连接时候,需要设置客户端的读回调。createClient--->connSetReadHandler--->(conn->type->set_read_handler)--->(connSocketReadHandler,其内部把读回调函数readQueryFromClient赋值给read_handler)--->(aeCreateFileEvent,把conn->type->ae_handler赋值给rfileProc)。原创 2024-04-25 17:18:45 · 1045 阅读 · 0 评论 -
Redis网络相关的结构体 和 reactor模式
上一章节讲解了Redis的网络交互流程,没有对关于网络部分的结构体有具体的讲解,所以该文章就主要讲解Redis网络部分使用的结构体。原创 2024-04-25 10:10:48 · 974 阅读 · 1 评论 -
Redis网络模型
我们知道redis 是单线程的,但是严格意义来说,redis 的网络读取命令和解析、发送客户端数据是多线程的。原创 2024-04-24 10:47:00 · 976 阅读 · 0 评论 -
Redis是如何淘汰key的 -- 内存策略
Redis之所以性能强,最主要的原因是其是基于的(内存本身就是很快的)。然而。当内存使用达到上限的时候,Redis就无法存储更多数据了。那么,Redis是如何避免达到内存上限的,即是其内存策略是怎样的呢。原创 2024-04-21 13:19:31 · 699 阅读 · 0 评论 -
Redis对外可见的5种数据结构
所以,hash采用的编码与zset也基本一致的,只需把排序相关的skiplist去掉即可。通过封装, 可以根据对象的类型动态地选择存储结构和可以使用的命令, 实现节省空间和优化查询速度。Redis中会根据存储的数据类型不同,会选择不同的编码方式。根据存储的数据类型的不同,Redis会选择不同的编码方式,共包含11中不同类型。set是Redis中的集合,不保证元素有序的,其元素唯一,查询效率高。,dict和skiplist的优势不明显,而且会更耗内存。zset结构的编码转换是在插入时候进行判断的,在函数。原创 2024-04-18 10:30:20 · 951 阅读 · 0 评论 -
压缩列表的替代-----listpack
对比ziplist,listpack牺牲了内存使用率,从而避免了连锁更新的情况。而从代码复杂度上看,listpack也相对简单不少,也把增删改统一做出来,从其代码实现上看,是简洁高效的。listpack是在Redis5中就引入的(使用在streams),直到6才作为t_hash的御用底层数据结构。可以看出,极致的内存使用远远比不上Redis的处理性能。而且现在的内存价格是降低的,大容量内存的成本也没这么高。原创 2024-04-16 14:57:42 · 1343 阅读 · 0 评论 -
跳表skiplist
跳表可以说是平衡树的一种替代品。它也是为了解决的的问题。那这个问题,hash 表解决的很好,插入和查找都是 O(1) 的时间复杂度。但若呢?这个时候 hash 表就不行了,二叉查找树可以解决这个问题。但是由于二叉查找树在按大小顺序进行插入的时候,就会退化为链表。所以又出现了平衡二叉树,而根据算法不同,又分为AVL树、B-Tree、B+Tree、红黑树等。(先不用管这些数据结构的实现,其是复杂的)。而跳表的出现就是为了解决平衡二叉树复杂的问题,它以一种。原创 2024-04-12 15:25:04 · 773 阅读 · 0 评论 -
快速列表quicklist
和压缩列表一样,entry结构在储存时是一连串的内存块,需要将其每个entry节点的信息读取到管理该信息的结构体中,以便操作。便于在链表的两端进行插入和删除操作,在插入节点上复杂度很低,但是它的内存开销比较大,每个节点除了要保存数据之外,还要。quicklist是个双端链表,节点结构是quicklistNode,节点的zl字段指向压缩列表。在 Redis 的早期设计中,如果列表类型的对象中元素的长度较小或数量比较少的,就采用。在Redis的quicklist结构中,实现了自己的迭代器,用于遍历节点。原创 2024-04-11 14:58:42 · 1076 阅读 · 0 评论 -
压缩列表ziplist
ziplist和普通的双向链表不同 ,ziplist不存储指向上一个链表节点和指向下一个链表节点的指针,而是存储上一个节点长度和当前节点长度,通过牺牲部分读写性能,来换取高效的内存空间利用率,节约内存,是一种时间换空间的思想。ziplist使用连续内存地址+偏移量的方式实现链表。适合存储一些int类型的数据或者长度比较短的字符串。压缩列表是 Redis 为节约空间而实现的一系列特殊编码的连续内存块组成的顺序型数据结构, 本质上是字节数组。原创 2024-04-10 14:13:05 · 875 阅读 · 0 评论 -
哈希字典Dict
在进行 rehash 期间,每次对字典执行 增、删、改、查操作时,程序除了执行指定的操作外,还会将 哈希表 ht[0].table中下标为 rehashidx 位置上的所有的键值对 全部迁移到 ht[1].table 上,完成后 rehashidx 自增。其实没有想象中的那么复杂,随着字典操作的不断执行,哈希表保存的键值对会不断增多(或者减少),为了让哈希表的负载因子维持在一个合理的范围之内,当哈希表保存的键值对数量太多或者太少时,需要对哈希表大小进行扩展或者收缩。,数组的每个元素称为一个哈希桶。原创 2024-04-07 15:50:41 · 735 阅读 · 0 评论 -
redis链表结构和简单动态字符串(SDS)
这些看宏名字就很容易知道其功能的。//sds.h关于sdshdr##T,不太懂,在这里理解成它将sdshdr和T连接在一起,即表示不同的 sdshdr 类型。关于, 参数 s 是sdshdr 结构体中的字符串指针,即等价于 buf,参数 T 则是表示不同类型的 sdshdr,取值可以为 8/16/32/64。然后看其实现,是宏定义的一个变量,void*是将结果转换为void*类型,以便sh接收。而 (s) - ( sizeof(struct sdshdr##T) )则表示指向结构体变量的地址。原创 2024-04-02 09:14:11 · 686 阅读 · 0 评论 -
整数集合intset
综上,Intset可以看做是特殊的整数数组Redis会确保lntset中的元素唯一、有序具备类型升级机制,可以节省内存空间底层采用二分查找方式来查询。原创 2024-04-08 08:54:40 · 752 阅读 · 0 评论 -
Redis源码分析
服务器设计的那部分Redis的aeEventLoop和Muduo的EventLoop要实现的主体功能是相似的,还有一些回调函数的设置的操作也是相似的。所以可以先看看我写的模仿Muduo实现的linux服务器,应该有助于理解事件循环和回调函数的设置。这里开始分析Redis的源码。分析的是Redis-6.0.17版本的源码。各种数据结构的设计,并且融合到事件循环中,助力服务器实现各个指令的功能。IO的封装,线程模型,服务器接受客户端执行,发送执行结果给客户端等等。这个感觉高大上很多,主从同步,集群等等。原创 2023-05-27 10:39:15 · 311 阅读 · 0 评论