Rides中的set类型

89 阅读4分钟

Set 集合

集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中 1)元素之间是⽆序的 2)元素不允许重复。

Redis 除了⽀持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集,合理地使⽤好集合类型,能在实 际开发中解决很多问题。

image.png

普通命令

SADD 将⼀个或者多个元素添加到 set 中。注意,重复的元素⽆法添加到 set 中。 语法:SADD key member [member ...]

命令有效版本:1.0.0 之后 时间复杂度:O(1) 返回值:本次添加成功的元素个数。

SMEMBERS 获取⼀个 set 中的所有元素,注意,元素间的顺序是⽆序的。 语法:SMEMBERS key

命令有效版本:1.0.0 之后 时间复杂度:O(N) 返回值:所有元素的列表。

SISMEMBER 判断⼀个元素在不在 set 中。 语法:SISMEMBER key member

命令有效版本:1.0.0 之后 时间复杂度:O(1) 返回值:1 表⽰元素在 set 中。0 表⽰元素不在 set 中或者 key 不存在。

SCARD 获取⼀个 set 的基数(cardinality),即 set 中的元素个数。 语法:SCARD key 命令有效版本:1.0.0 之后 时间复杂度:O(1) 返回值:set 内的元素个数。

SPOP 从 set 中删除并返回⼀个或者多个元素。注意,由于 set 内的元素是⽆序的,所以取出哪个元素实际是 未定义⾏为,即可以看作随机的。 语法:SPOP key [count]

命令有效版本:1.0.0 之后 时间复杂度:O(N), n 是 count 返回值:取出的元素。

SMOVE 将⼀个元素从源 set 取出并放⼊⽬标 set 中。 语法:SMOVE source destination member

命令有效版本:1.0.0 之后 时间复杂度:O(1) 返回值:1 表⽰移动成功,0 表⽰失败。

SREM 将指定的元素从 set 中删除。 语法:SREM key member [member ...]

命令有效版本:1.0.0 之后 时间复杂度:O(N), N 是要删除的元素个数. 返回值:本次操作删除的元素个数。

集合间操作

SINTER 获取给定 set 的交集中的元素。 语法:SINTER key [key ...]

命令有效版本:1.0.0 之后 时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数. 返回值:交集的元素。

SINTERSTORE 获取给定 set 的交集中的元素并保存到⽬标 set 中。 语法:SINTERSTORE destination key [key ...]

命令有效版本:1.0.0 之后 时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数. 返回值:交集的元素个数。

SUNION 获取给定 set 的并集中的元素。 语法:SUNION key [key ...]

命令有效版本:1.0.0 之后 时间复杂度:O(N), N 给定的所有集合的总的元素个数. 返回值:并集的元素。

SUNIONSTORE 获取给定 set 的并集中的元素并保存到⽬标 set 中。 语法:SUNIONSTORE destination key [key ...]

命令有效版本:1.0.0 之后 时间复杂度:O(N), N 给定的所有集合的总的元素个数. 返回值:并集的元素个数。

SDIFF 获取给定 set 的差集中的元素。 语法:SDIFF key [key ...]

命令有效版本:1.0.0 之后 时间复杂度:O(N), N 给定的所有集合的总的元素个数. 返回值:差集的元素。

SDIFFSTORE 获取给定 set 的差集中的元素并保存到⽬标 set 中。 语法:SDIFFSTORE destination key [key ...]

命令有效版本:1.0.0 之后 时间复杂度:O(N), N 给定的所有集合的总的元素个数. 返回值:差集的元素个数。

内部编码

集合类型的内部编码有两种:

• intset(整数集合):当集合中的元素都是整数并且元素的个数⼩于 set-max-intset-entries 配置(默认 512 个)时,Redis 会选⽤ intset 来作为集合的内部实现,从⽽减少内存的使⽤。

• hashtable(哈希表):当集合类型⽆法满⾜ intset 的条件时,Redis 会使⽤ hashtable 作为集合的内部实现。

使⽤场景

集合类型⽐较典型的使⽤场景是标签(tag)。例如 A ⽤⼾对娱乐、体育板块⽐较感兴趣,B ⽤⼾对历史、新闻⽐较感兴趣,这些兴趣点可以被抽象为标签。有了这些数据就可以得到喜欢同⼀个标签的⼈,以及⽤⼾的共同喜好的标签,这些数据对于增强⽤⼾体验和⽤⼾黏度都⾮常有帮助。 例如⼀个电⼦商务⽹站会对不同标签的⽤⼾做不同的产品推荐。下⾯的演⽰通过集合类型来实现标签的若⼲功能。