是什么?
Redis 的 Set 是一个无序的、不重复的集合字符串集合。
如果底层数据编码为 INTSET,其实是有序的,不过不推荐依赖这个,整体还是看作无序来使用为好。
场景
无序集合场景。如关注了那些公众号,Set 提供了查交集、并集的功能,可以很方便的实现共同关注功能。
常用操作
创建:
SADD key member[member...] 添加/修改元素,并返回成功添加元素个数
查询:
SISMEMBER key member 查看元素是否存在
SCARD key 查询集合元素个数
SMEMBERS key 查看集合所有元素
SSCAN key cursor [MATCH pattern] [COUNT count] 指定游标查询集合元素
可以指定个数,默认为10。返回结果中第一行为下一次查询要使用的游标,为0则表示已查询全部数据
例:从0号位查询集合 setjelly 的数据
127.0.0.1:6379> SSCAN setjelly 0
1) "0"
2) 1) "JJ"
2) "EE"
3) "LL"
4) "YY"
SINTER key [key ...] 查询在第一个集合中,且在后续所有集合中的数据
SUNION key [key ...] 查询集合并集,集合数要大于等于2
SDIFF key [key ...] 查询在第一个集合中存在,在后续集合中不存在的数据,集合数要大于等于2
更新:
SADD key member[member...] 添加/修改元素,并返回成功添加元素个数
SREM key member[member...] 删除元素,并返回成功删除元素个数
删除:
SDEL key [key ...] 删除对象,返回成功删除的键的个数
底层实现
编码方式
出于性能考虑,Set 也支持两种编码方式,分别是 INTSET、HASHTABLE。
如果集合元素都是整数,且数量不超过512个,使用 INTSET 编码方式。
如果不满足 INTSET 编码方式要求,则使用 HASHTABLE 编码方式。
-
INTSET
INTSET排列紧凑,内存占用较少,查询时需使用二分查找。
-
HASHTABLE
HASHTABLE查询一个元素的性能很高,能在O(1)时间就确认一个元素是否存在。
总结
Redis 的 Set 对象可以很方便的管理无序集合,还可以对多个集合求交集、并集、差集。底层编码方式有两种,INTSET 在少量整数集合时使用以节约内存,HASHTABLE 适用于需要快速定位某个元素的场景。