深入探讨Redis数据结构

发布于 2024-07-18
968

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

扫码阅读
手机扫码阅读

深入探讨Redis数据结构

1. Redis数据结构-动态字符串

Redis的字符串结构采用简单动态字符串(SDS)而非C语言的传统字符串,解决了传统字符串的非二进制安全、不可修改等问题。SDS支持动态扩容,例如为一个内容为“hi”的字符串追加内容时,Redis会根据字符串大小动态分配内存,扩展规则如下:

  • 新字符串长度<1M,则扩展后长度为两倍+1。
  • 新字符串长度>1M,则扩展后长度为原长度+1M+1。

2. Redis数据结构-intset

IntSet是Redis中基于整数数组实现的set集合,支持长度可变和有序存储。为了节省内存,IntSet会根据存储元素的大小动态升级编码方式,例如:

  • 存储元素超出当前编码范围时,升级到更高字节数的编码。
  • 升级后通过倒序拷贝元素并扩容数组,新元素添加到数组末尾。

特点包括:

  • 元素唯一且有序。
  • 类型升级机制节省内存。
  • 采用二分查找方式查询。

3. Redis数据结构-Dict

Redis的键值映射通过Dict实现,其核心包括哈希表(DictHashTable)、哈希节点(DictEntry)和字典(Dict)。Dict通过哈希值计算元素存储位置,并解决哈希冲突。扩容和收缩机制如下:

  • 扩容:LoadFactor≥1且无后台进程任务,或LoadFactor>5时。
  • 收缩:LoadFactor<0.1时。

扩容和收缩过程中,Dict会通过渐进式rehash将旧哈希表的数据迁移到新哈希表,确保效率和一致性。

特点包括:

  • 底层采用数组结合链表解决冲突。
  • 支持渐进式rehash,减少性能影响。

4. Redis数据结构-ZipList

ZipList是一种双端链表结构,由连续内存块组成,支持O(1)时间复杂度的压入/弹出操作。其结构包括以下属性:

  • zlbytes:记录内存字节数。
  • zltail:记录尾节点偏移量。
  • zllen:记录节点数量,超过最大值时需遍历计算。
  • entry:保存列表节点。
  • zlend:标记列表末端。

ZipListEntry采用编码属性代替指针记录内容类型与长度,存储采用小端字节序节省内存。例如:

  • 前一节点长度小于254字节时占1个字节,大于254时占5个字节。
  • encoding属性决定内容的类型(字符串或整数)。

特点包括:

  • 节省内存空间。
  • 支持高效的双端操作。

springboot葵花宝典

主要分享JAVA技术,主要包含SpringBoot、SpingCloud、Docker、中间件等技术,以及Github开源项目

276 篇文章
浏览 308.5K

还在用多套工具管项目?

一个平台搞定产品、项目、质量与效能,告别整合之苦,实现全流程闭环。

加入社区微信群
与行业大咖零距离交流学习
PMO实践白皮书
白皮书上线