redis(1)(3)——底层数据结构

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、哨兵模式中的主从节点管理

注:以上为本人小小总结,如果对您起到了一点点帮助,请给予我一点鼓励,在下方点个小小的赞,谢谢,如有错误之处,望不吝指出,非常感谢! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值