Redis Set集合操作全解析
Set集合
集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中的元素之间是无序的,不允许重复。
普通命令
SADD
将一个或者多个元素添加到set中。注意,重复的元素无法添加到set中
语法:
SADD key member [member ...]
时间复杂度:O(1)
举个例子:
SMEMBERS
获取一个set中的所有的元素,注意,元素之间的顺序是无须的
语法:
SMEMBERS key
时间复杂度:O(N)
返回值:所有元素的列表
SISMEMBER
判断一个元素在不在set中
语法:
SISMEMBER key member
时间复杂度:O(1)
返回值:1表示元素在set中。0表示元素不在set中或者key不存在
举个例子:
SCARD
获取一个set的基数,即se中元素的个数
语法:
SCARD key
返回值:set内的元素的个数
举个例子:
SPOP
从set中删除并返回一个或者多个元素。注意,由于set中的元素的无需的,所有取出哪个元素实际上是未定义的行为,也就是随机的
语法:
SPOP key [count]
时间复杂度:O(N),N是count
返回值:取出的元素
举个例子:
SMOVE
将一个元素从原set放到目标set中
语法:
SMOVE source destination member
时间复杂度:O(1)
返回值:1表示成功,0表示失败
举个例子:
SREM
将制定的元素从set中删除
语法:
SREM key member [member ...]
时间复杂度:O(N),N是要删除的元素的个数
返回值:本次操作删除的元素的个数
举个例子:
集合间操作
交集、并集、差集的概念
SINTER
获取给定的set的交集中的元素
语法:
SINTER key [key ...]
时间复杂度:O(N*M),N是最小的集合元素个数,M是最大的集合元素个数
返回值:交集的元素
举个例子:
SINTERSTORE
获取给定set的交集中的元素保存到目标set中
语法:
SINTERSTORE destination key [key ...]
时间复杂度:O(N*M),N是最小的集合元素个数,M是最大的集合元素个数
返回值:交集的元素个数
SUNION
获取给定set的并集中的元素
语法:
SUNION key [key ...]
时间复杂度:O(N),N给定的所有集合的总的元素个数
返回值:并集的元素
SUNIONSTORE
获取给定set的并集中的元素并保存到目标set中
语法:
SUNIONSTORE destination key [key ...]
时间复杂度:O(N),N给定的所有集合中的总得元素个数
返回值:并集的元素的个数
举个例子:
SDIFF
获取给定set的差集中的元素
语法:
SDIFF key [key ...]
时间复杂度:O(N),N给定的所有集合的总得元素的个数
返回值:差集的元素
举个例子:
SDIFFSTORE
获取给定set的差集中的元素并保存到目标set中
语法:
SDIFFSTORE destination key [key ...]
时间复杂度:O(N),N给定的所有集合的总得元素的个数
返回值:差集的元素个数
举个例子:
命令小结
内部编码
集合类型的内部编码有两种
- intset(整数集合):当集合中的元素都是整数,并且元素的个数小于set-max-intset-entries配置时,Redis会选用intset来作为集合的内部实现,从而减少内存的使用
- hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现
使用场景
集合类型比较典型的场景就是标签。例如A用户对娱乐、体育板块比较感兴趣,B用户对历史、新闻比较感兴趣,这些兴趣点可以抽象为标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于增强用户体验和用户粘度都非常的有帮助。