文章目录
- ☃️概述
- ☃️数据结构
- ☃️源码
- ☃️其他
🌈 欢迎莅临我的个人主页👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇
🎓 博主简介:
我是请回答1024,一名Java领域深耕多年的技术博主,每一步成长都离不开持续的学习和积累。🔧 技术专长:
在 Java 的广阔领域中,我不断深入学习,特别是在MySQL, Redis 等方面,我积累了丰富的实践经验。我热衷于将编程技能转化为解决实际问题的有效工具。因此,业余时间里,我积极参与技术支持工作,已经为数百名用户提供了近千次专业帮助,助力他们高效地解决了各种问题。我深信,技术的真正价值在于服务人类,提升生活质量。📝 博客风采:
我深知知识分享的重要性,因此,在博客中我倾注心血,撰写并分享关于深度学习、PyTorch、Python的实用内容。今年,我笔耕不辍,已发表原创文章300余篇,代码分享次数逾两万次。我衷心希望通过这些内容,为广大读者提供实用的学习资源和解决方案,助力他们在深度学习的道路上稳步前行。💡 服务项目:
除了知识分享,我还提供科研入门辅导(代码实战方面)、知识付费答疑以及个性化需求解决等服务。我深知每个人的需求都是独特的,因此我致力于提供个性化的解决方案,以满足不同用户的需求。如果您对以上服务感兴趣,或者有任何疑问,欢迎添加底部微信(reply1024)与我交流。
☃️概述
Set
是 Redis
中的单列集合,满足下列特点:
- 不保证有序性
- 保证元素唯一
- 求交集、并集、差集
可以看出,Set
对查询元素的效率要求非常高,思考一下,什么样的数据结构可以满足?
HashTable
,也就是Redis
中的Dict
,不过Dict
是双列集合(可以存键、值对)
Set
是Redis
中的集合,不一定确保元素有序,可以满足元素唯一、查询效率要求极高。
☃️数据结构
-
为了查询效率和唯一性,set采用HT编码(Dict)。Dict中的key用来存储元素,value统一为null。
-
当存储的所有数据都是整数,并且元素数量不超过set-max-intset-entries时,Set会采用
IntSet
编码,以节省内存。
结构如下:
☃️源码
☃️其他
底下的就别看了
在 Redis 中,Set 类型的底层数据结构主要有两种:哈希表和有序集合。
哈希表:
Redis 中的 Set 类型通常使用哈希表来实现。哈希表是一种键值对存储结构,其中键是唯一的,而值则不需要唯一。哈希表的特点是可以快速地进行插入、删除和查找操作,平均时间复杂度为 O(1)。
有序集合:
有序集合是一种特殊的 Set 类型,它在每个元素的基础上关联了一个分值(score),这个分值用来对集合中的元素进行排序。在有序集合中,元素是唯一的,但分值可以重复。Redis 中的有序集合数据结构可以是跳跃表(skiplist)或者是压缩列表和哈希表的混合结构,具体选择哪种取决于元素数量和类型。
跳跃表:
跳跃表是一种有序数据结构,类似于链表,但是通过添加多级索引使得查找效率更高。在 Redis 中,跳跃表常被用来实现有序集合,因为它支持快速的元素插入、删除和范围查找操作,平均时间复杂度为 O(log n)。
压缩列表和哈希表:
对于元素数量较少的有序集合,Redis 也可以使用压缩列表和哈希表的混合结构来存储数据。这种结构在节省内存空间方面比跳跃表更有优势,但在插入和删除操作上可能没有跳跃表高效。
Redis 的 Set 类型主要使用哈希表来实现普通集合,而对于有序集合,则可以使用跳跃表或者压缩列表和哈希表的混合结构。这些不同的底层数据结构使得 Redis 能够高效地支持 Set 类型的各种操作需求。