深入探讨Redis数据结构
发布于 2024-07-18
968
版权声明
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
springboot葵花宝典
扫码关注公众号
扫码阅读
手机扫码阅读
深入探讨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葵花宝典
springboot葵花宝典
扫码关注公众号
还在用多套工具管项目?
一个平台搞定产品、项目、质量与效能,告别整合之苦,实现全流程闭环。
查看方案
springboot葵花宝典的其他文章
什么是类加载器?什么是双亲委派模型?
什么是类加载器?什么是双亲委派模型?
Spring三级缓存解决循环依赖
Spring三级缓存解决循环依赖
SpringBoot-29-RestTemplate的Get请求使用详解
SpringBoot-29-RestTemplate的Get请求使用详解
SpringBoot-32-常用注解汇总2
SpringBoot-32-常用注解汇总2
高效构建可靠的分布式系统:掌握Spring Cloud和Eureka的实战技巧
服务注册与发现是指将服务注册到一个中心化的地方(称为注册中心),同时提供查询接口,让服务消费者可以方便地查找并调用服务。通过服务注册与发现机制,服务提供者和服务消费者之间的耦合度得以降低,系统的可扩展性和灵活性也得到提高。
加入社区微信群
与行业大咖零距离交流学习
PMO实践白皮书
白皮书上线
白皮书上线