持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
集合(set)
- Set 集合用于存储无序且不重复的元素。
- 列表可以存储重复元素,而集合只会存储非重复元素。如添加已存在的元素将被忽略
- 一个集合中最多可以存储2^32-1个元素
- 除了支持常规的增删改查,Redis还支持多个集合取交集、并集、差集。
内部编码
底层使用两种数据结构存储:
集合的内部编码可以是整数集合(intset)或哈希表(hashtable)。
-
inset 可理解为数组
-
hashtable 普通的哈希表(key为set的值,value为null) 使用intset存储必须满足下面两个条件,否则使用hashtable,条件如下:
-
对象保存的所有元素都是整数值(int)
-
对象保存的元素数量不超过512个
-
需要注意的是,集合在使用哈希表时,值全部被置为null。
整数集合的结构定义如下:
- encoding代表contents中存储内容的类型,
- 虽然contents(存储集合中的元素)是int8_t类型,但实际上其存储的值是int16_t、int32_t或int64_t,具体的类型便是由encoding决定的
- length表示元素个数。
整数集合适用于集合所有元素都是整数且集合元素数量较小的时候,与哈希表相比,整数集合的优势在于集中存储,节省空间;同时,虽然对于元素的操作复杂度也由O(1)变为了O(n),但由于集合数量较少,因此操作的时间并没有明显劣势。
编码转换
只有同时满足下面两个条件时,集合才会使用整数集合:
- 集合中元素数量小于512个
- 集合中所有元素都是整数值
- 如果有一个条件不满足,则使用哈希表
- 且编码只可能由整数集合转化为哈希表,反向不行