目录
- set简单介绍
- sadd
- smembers
- sismember
- scard
- spop
- srandmember
- smove
- srem
- sinter
- sinterstore
- sunion
- sunionstore
- sdiff
- sdiffstore
- 编码方式
- 使用场景
set简单介绍
集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中元素之间是无序的(顺序不重要,元素交换一下顺序,元素还是那个元素),元素不允许重复。一个集合中最多可以存储 2^32 - 1 个元素。Redis 除了支持集合内的增删查改操作,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多问题。

sadd
将一个或者多个元素添加到 set 中。注意,重复的元素无法添加到 set 中。


该指令返回成功添加了几个元素。如果 key 不存在,则会创建一个。可以看到,元素是无序的,并不按照插入顺序排列。
smembers
获取一个 set 中的所有元素,注意,元素间的顺序是无序的。


sismember
判断一个元素在不在 set 中。


scard
获取一个 set 的基数(cardinality),即 set 中的元素个数。


spop
从 set 中删除并返回一个或者多个元素。注意,由于 set 内的元素是无序的,所以取出哪个元素实际是未定义行为,即可以看作随机的。


可以看到两轮 spop 的结果不一样,所以这玩意是真随机,不是说因为 set 是无序的,所以底层不按顺序放的,因而你 pop 出来的一直都是这个底层不按顺序的顺序。他这个真是一个 random 算法随机出来的,所以是真随机(真的伪随机哈哈)。
srandmember
会从集合中返回一个或多个随机元素,但不会移除这些元素。


smove
将一个元素从源 set 取出并放入目标 set 中。


返回 1 表示成功,返回 0 表示失败。如果转移目标有这个元素,因为 set 的特性,目标不会有变化,但是被转移者确实会少了这个元素。如果被转移者没有要转移的元素,会失败。
srem
将指定的元素从 set 中删除。


sinter
获取给定 set 的交集中的元素。


sinterstore
获取给定 set 的交集中的元素并保存到目标 set 中。


如果是不存在的键会自动创建。
sunion
获取给定 set 的并集中的元素。


sunionstore
获取给定 set 的并集中的元素并保存到目标 set 中。


sdiff
获取给定 set 的差集中的元素。


注意前后顺序不一样会有差别,都是前面减后面的。
sdiffstore
获取给定 set 的差集中的元素并保存到目标 set 中。


编码方式
集合类型的内部编码有两种:
intset(整数集合):当集合中的元素都是整数并且元素的个数小于 set-max-intset-entries 配置(默认 512 个)时,Redis 会选用 intset 来作为集合的内部实现,从而减少内存的使用。intset相对低效,但是元素少就还好。
hashtable(哈希表):当集合类型无法满足 intset 的条件时,Redis 会使用 hashtable 作为集合的内部实现。
使用场景
集合类型最典型的应用场景是标签管理,在各类互联网产品中,可将用户的兴趣偏好(如娱乐、体育、历史、新闻等)抽象为标签,通过集合相关命令对用户与标签的关联关系进行全生命周期管理。具体来说,既可以为不同用户添加对应的兴趣标签,也能反向为每个标签关联对应的用户群体,同时支持灵活删除指定用户下的特定标签,或是从某一标签下移除对应的用户;此外,借助集合的交集运算功能,还能精准计算出不同用户之间的共同兴趣标签,这些基于标签的数据分析结果,能为电子商务网站等平台的个性化产品推荐、提升用户体验和增强用户黏度提供核心的数据支撑。