1,总体结构图
2,详解redisObject
高16位: 最后被访问的时间
lfu----->低8位:最近访问次数
2.1 refcount
refcount 记录的是该对象被引用的次数,类型为整型。
refcount 的作用,主要在于对象的引用计数和内存回收。
当对象的refcount>1时,称为共享对象 Redis 为了节省内存,当有一些对象重复出现时,新的程序不会创建新的对象,而是仍然使用原来的对 象
2.2 ptr
ptr 指针指向具体的数据,比如:set hello world,ptr 指向包含字符串 world 的 SDS。
三、ptr详解(7种类型)
int
int类型的整数
embstr
(编码的简单动态字符串)
小字符串 长度小于44个字节
raw
(简单动态字符串)
大字符串 长度大于44个字节
quicklist
快速链表是双向列表与压缩列表的组合
举例
应用场景
列表(List)的底层实现、发布与订阅、慢查询、监视器等功能。
ziplist
小整数或短字符串
压缩列表(ziplist)是由一系列特殊编码的连续内存块组成的顺序型数据结构
节省内存
是一个字节数组,可以包含多个节点(entry)。每个节点可以保存一个字节数组或一个整数。
ziplist结构图
hash-ziplist
当散列表元素的个数比较少,且元素都是小整数或短字符串时。
如:
hmset user:001 username zhangfei password 111 age 23 sex M
sorted-ziplist
当元素的个数比较少,且元素都是小整数或短字符串时
intset(整数集合)
整数集合(intset)是一个有序的(整数升序)、存储整数的连续存储结构。 当Redis集合类型的元素都是整数并且都处在64位有符号整数范围内(2 ^ 63 – 1),使用该结构体存储
如
应用场景
可以保存类型为int16_t、int32_t 或者int64_t 的整数值,并且保证集合中不会出现重复元素。
skiplist
当元素的个数比较多或元素不是小整数或短字符串时
跳跃表是有序集合(sorted-set)的底层实现,效率高,实现简单。 跳跃表的基本思想: 将有序链表中的部分节点分层,每一层都是一个有序链表。
查找
在查找时优先从最高层开始向后查找,当到达某个节点时,如果next节点值大于要查找的值或next指针 指向null,则从当前节点下降一层继续向后查找。
优势
1、可以快速查找到需要的节点
2、可以在O(1)的时间复杂度下,快速获得跳跃表的头节点、尾结点、长度和高度。
应用场景
有序集合的实现
完整机构图
四、字典扩容
字典达到存储上限,需要rehash(扩容)
扩容流程
说明: 1. 初次申请默认容量为4个dictEntry,非初次申请为当前hash表容量的一倍。 2. rehashidx=0表示要进行rehash操作。 3. 新增加的数据在新的hash表h[1] 4. 修改、删除、查询在老hash表h[0]、新hash表h[1]中(rehash中) 5. 将老的hash表h[0]的数据重新计算索引值后全部迁移到新的hash表h[1]中,这个过程称为 rehash。
渐进式rehash
当数据量巨大时rehash的过程是非常缓慢的,所以需要进行优化。 服务器忙,则只对一个节点进行rehash 服务器闲,可批量rehash(100节点)
应用场景
1、主数据库的K-V数据存储
2、散列表对象(hash)
3、哨兵模式中的主从节点管理
注:以上为本人小小总结,如果对您起到了一点点帮助,请给予我一点鼓励,在下方点个小小的赞,谢谢,如有错误之处,望不吝指出,非常感谢!