Redis学习目录总结06-Redis的对象类型与内部编码-Set(集合)

177 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

集合(set)

  • Set 集合用于存储无序且不重复的元素。
  • 列表可以存储重复元素,而集合只会存储非重复元素。如添加已存在的元素将被忽略
  • 一个集合中最多可以存储2^32-1个元素
  • 除了支持常规的增删改查,Redis还支持多个集合取交集、并集、差集。

内部编码

底层使用两种数据结构存储:

集合的内部编码可以是整数集合(intset)或哈希表(hashtable)。

  • inset 可理解为数组

  • hashtable 普通的哈希表(key为set的值,value为null) 使用intset存储必须满足下面两个条件,否则使用hashtable,条件如下:

  • 对象保存的所有元素都是整数值(int)

  • 对象保存的元素数量不超过512个

  • 需要注意的是,集合在使用哈希表时,值全部被置为null。

整数集合的结构定义如下:

image.png

  • encoding代表contents中存储内容的类型,
  • 虽然contents(存储集合中的元素)是int8_t类型,但实际上其存储的值是int16_t、int32_t或int64_t,具体的类型便是由encoding决定的
  • length表示元素个数。

整数集合适用于集合所有元素都是整数且集合元素数量较小的时候,与哈希表相比,整数集合的优势在于集中存储,节省空间;同时,虽然对于元素的操作复杂度也由O(1)变为了O(n),但由于集合数量较少,因此操作的时间并没有明显劣势。

编码转换

只有同时满足下面两个条件时,集合才会使用整数集合:

  • 集合中元素数量小于512个
  • 集合中所有元素都是整数值
  • 如果有一个条件不满足,则使用哈希表
  • 且编码只可能由整数集合转化为哈希表,反向不行

命令

image.png