1. Set是什么?

一个存储若干元素的合集,底层是整数有序数组或者字符串字典,redis set 提供常见的并交减查操作.

2. 适用场景

  • 适用于一些对数据顺序不太关心的合集类场景,比如用户关注列表,用户个人书单什么的.

3. 常用操作

3.1 写操作

  • SADD key[set_name] val1 val2 val3 ... [往集合加入元素]

  • SREM key[set_name] val1 val2 val3 ... [删除集合元素]

3.2 读操作

  • SISMEMBER key[set_name] val [判断元素是否在集合中]

  • SCARD key[set_name] [集合元素个数]

  • SMEMBERS key[set_name] [打印集合所有元素]

  • SSCAN key[set_name] cursor match_pattern count [递增遍历集合返回符合给定参数的集合]

cursor 游标

match_pattern 匹配模式串(匹配条件)

count 返回集合元素个数

  • SINTER key1[set_name] key2[set_name] ... [求交集 intersection....]

  • SUNION key1[set_name] key2[set_name] ... [求并集]

  • SDIFF key1[set_name] key2[set_name] ... [集合减:集合1 - 集合2 = 集合1不在这堆集合中的元素]

4. 底层实现

编码方式

Redis SET由两种编码方式:

  • INTSET :整数编码(整数,顺序,定长,数组)

这里先偷个大佬的图

注意事项: 整数集合编码出于性能考虑最大长度只支持512个元素,超过就会用字典,查找效率O(log2N)

  • HASHTABLE

这里也偷个大佬的图

Redis SET 和 HASH 用的字典是同一个数据结构,SET只是没有存val 而已.查找效率O(1)


INTERVIEW

1.Set是有序的吗?

  • 元素都是整数的且元素个数不超512的时候是有序的,采用REDIS_ENCODING_INTSET,存在一个定长数组中

  • 字符类型是存在字典中,字典无序

2.如何查看set[集合] 所有成员?

  • SMEMBER key

3.如何查看set[集合] 成员个数?

  • SCARD key

4.求交集,求并集?

  • SINTER key1 key2 ... 交集

  • SUNION key1 key2 ... 并集

5.Set的编码方式?

  • 看问题一

6.Set为什么要用两种编码方式?

  • 数组结构紧凑,节省内存,局部性好,提高命中率,限长512 处于效率考虑

  • 是集合功能的补充,使set支持字符,且随着数据量远大于512,字典编码的方案会逐渐显现出字典索引的优势