集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中
1)元素之间是无序的
2)元素不允许重复
一个集合中最多可以存储2^32-1个元素。
Redis 除了支持集合内的增删查改操作,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多问题。
基本命令
sadd命令
将一个或者多个元素添加到 set 中。注意,重复的元素无法添加到 set 中。
返回值:本次添加成功的元素个数
sadd key member [member ...]
smembers命令
获取一个 set 中的所有元素,注意,元素间的顺序是无序的。
返回值:所有元素的列表。
smembers key
sismember命令
判断一个元素在不在 set 中。
返回值:1 表示元素在 set 中。0 表示元素不在 set 中或者 key 不存在
sismember key member
scard命令
获取一个 set 的基数(cardinality),即 set 中的元素个数
返回值:set 内的元素个数
scard key
spop命令
从 set 中删除并返回一个或者多个元素。
注意,由于 set 内的元素是无序的,所以取出哪个元素实际是未定义行为,即可以看作随机的
返回值:取出的元素
spop key [count]
可以看到,同样是spop删除,key和key2的删除顺序不同
当把元素删完后,再删会显示nil,并且键值对也就没了
smove命令
将一个元素从源 set 取出并放入目标 set 中
返回值:1 表示移动成功,0 表示失败
smove source destination member
srem命令
将指定的元素从 set 中删除
返回值:本次操作删除的元素个数
srem key member [member ...]
集合间操作
sinter命令
获取给定 set 的交集中的元素
返回值:交集的元素
时间复杂度:O(N * M)
sinter key [key ...]
sinterstore命令
获取给定 set 的交集中的元素并保存到目标 set 中
返回值:交集的元素个数
sinterstore destination key [key ...]
也就是说:把key和key2里的元素的交集放进key3
sunion命令
获取给定 set 的并集中的元素
返回值:并集的元素
sunion key [key ...]
sunionstore命令
获取给定 set 的并集中的元素并保存到目标 set 中
返回值:并集的元素个数
sunionstore destination key [key ...]
sdiff命令
获取给定 set 的差集中的元素
返回值:差集的元素
sdiff key [key ...]
sdiffstore命令
获取给定 set 的差集中的元素并保存到目标 set 中
返回值:差集的元素个数
sdiffstore key [key ...]
内部编码
集合类型的内部编码有两种:
• intset(整数集合):当集合中的元素都是整数并且元素的个数小于 set-max-intset-entries 配置 (默认 512 个)时,Redis 会选用 intset 来作为集合的内部实现,从而减少内存的使⽤。
• hashtable(哈希表):当集合类型无法满足 intset 的条件时,Redis 会使用 hashtable 作为集合 的内部实现。
1) 当元素个数较少并且都为整数时,内部编码为 intset:
2)当元素个数超过 512 个,内部编码为 hashtable:
3)当存在元素不是整数时,内部编码为 hashtable:
应用场景
集合类型比较典型的使用场景是标签(tag)。
例如 A 用户对娱乐、体育板块比较感兴趣,B 用户对历史、新闻比较感兴趣,这些兴趣点可以被抽象为标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于增强用户体验和用户黏度都非常有帮助。 例如一个电子商务网站会对不同标签的用户做不同的产品推荐。