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,字典编码的方案会逐渐显现出字典索引的优势