Set
- 常用命令
- sadd
- smembers
- sismember
- scard
- spop
- smove
- srem
- 集合间操作
- sinter 交集
- sinterstore
- sunion 并集
- sunionstore
- sdiff 差集
- sdiffstore
- 命令总结
- 内部编码
- 应用场景
- 使用 set来保存用户的“标签”
set(集合)就是把一些有关联的数据放刀一起。
它与list的区别如下:
- 集合中的元素是无序的!
这里说的有序是指变换顺序后,就是不同的list,具体大致如下:
list [1, 2, 3] 和 [2, 1, 3] 是两个不同的list,而set[1, 2, 3] 和[2, 1, 3]是同一个集合 - 集合中的元素是不能重复的。
集合中的元素叫做 member。
常用命令
sadd
作用:将⼀个或者多个元素添加到 set 中。注意,重复的元素⽆法添加到 set 中。
语法:SADD key member [member ...]
返回值:本次添加成功的元素个数。
smembers
作用:获取⼀个 set 中的所有元素,注意,元素间的顺序是⽆序的。
语法:SMEMBERS key
sismember
作用:判断⼀个元素在不在 set 中。
语法:SISMEMBER key member
返回值:1 表⽰元素在 set 中。0 表⽰元素不在 set 中或者 key 不存在。
scard
作用:用于获取集合中成员的数量
语法:SCARD key
spop
作用:从set中随机删除一个或多个 member 并返回一个或多个随机member。
语法:SPOP key [count]
smove
作用:把member 从 source 上删除,再插入到 destination 中。
语法:
SMOVE source destination member
返回值:1 表⽰移动成功,0 表⽰失败。
如果此时有个 key2 里面 有 member元素 4了,再从key3中把这个 member元素4 移动 key2时,key3中 4 会被删除,key2中不会新增多一个4。
srem
作用:将指定的 member 从 set 中删除。
语法:
SREM key member [member ...]
返回值:本次操作删除的元素个数。
集合间操作
sinter 交集
作用:获取给定 set 的交集中的元素。
语法:SINTER key [key ...]
返回值:交集的元素。
sinterstore
作用:获取给定 set 的交集中的元素并保存到⽬标 set 中。
语法:SINTERSTORE destination key [key ...]
返回值:交集的元素个数。
sunion 并集
作用:获取给定 set 的并集中的元素。
语法:SUNION key [key ...]
sunionstore
作用:获取给定 set 的并集中的元素并保存到⽬标 set 中。
语法:SUNIONSTORE destination key [key ...]
返回值:并集的元素个数。
sdiff 差集
作用:获取给定 set 的差集中的元素。
语法:SDIFF key [key ...]
sdiffstore
作用:获取给定 set 的差集中的元素并保存到⽬标 set 中
语法:SDIFFSTORE destination key [key ...]
命令总结
命令 | 时间复杂度 |
---|---|
sadd key element [element …] | O(k),k是元素个数 |
srem key element [element …] | O(k),k是元素个数 |
scard key | O(1) |
sismember key element | O(1) |
srandmember key [count] | O(n),n 是 count |
spop key [count] | O(n),n 是 count |
smembers key | O(k), k 是元素个数 |
sinter key [key …] sitnerstore | O(m * k) |
sunion key [key …] sunionstore | O(k),k 是多个集合的元素个数总和 |
sdiff key [key …] sdiffstore | O(k),k 是多个集合的元素个数总和 |
内部编码
集合类型的内部编码有两种:
- intset(整数集合):当集合中的元素都是整数并且元素的个数⼩于 set-max-intset-entries 配置(默认 512 个)时,Redis 会选⽤ intset 来作为集合的内部实现,从⽽减少内存的使⽤。
- hashtable(哈希表):当集合类型⽆法满⾜ intset 的条件时,Redis 会使⽤ hashtable 作为集合的内部实现。
intset是为了节省空间,做出的特定优化,只有当元素全为整数,并且元素个数不是很多的时候才会被优化菜intset。
应用场景
使用 set来保存用户的“标签”
集合类型比较典型的使⽤场景是标签(tag)。例如 A 用户对娱乐、体育板块比较感兴趣,B 用户 对历史、新闻比较感兴趣,这些兴趣点可以被抽象为标签。有了这些数据就可以得到喜欢同⼀个标签的⼈,以及用户的共同喜好的标签,这些数据对于增强用户体验和用户黏度都⾮常有帮助。 例如⼀个电⼦商务⽹站会对不同标签的用户做不同的产品推荐或者例如qq的好友推荐等。