【Redis】Set 集合
文章目录
- 常用命令
- sadd
- smembers
- sismember
- scard
- spop
- smove
- srem
- 集合间操作
- sinter && sinterstore
- sunion && sunionstore
- sdiff && sdiffstore
- 内部编码
- 应用场景
集合类型也是用于存储多个字符串类型的数据结构
集合中元素之间是 1. 无序的 2. 不允许重复的
一个集合最多可以存储 232 - 1 个元素,Redis 的集合支持增删改查操作,和多个集合之间取交集、并集、差集
常用命令
sadd
将一个或者多个元素添加到 set 中,若添加重复的元素,则无效果
sadd key member [member …]
返回值:本次添加成功的元素个数,重复的元素不计入统计
示例:
127.0.0.1:6379> sadd key1 zhangsan lisi wangwu zhaoliu
(integer) 4
127.0.0.1:6379> sadd key1 zhangsan
(integer) 0
smembers
获取一个 set 中所有的元素,元素之间是无序的
smembers key
返回值:所有元素的列表
示例:
127.0.0.1:6379> smembers key1
1) "wangwu"
2) "zhangsan"
3) "zhaoliu"
4) "lisi"
sismember
判断一个元素是否在该 set 中
sismember key number
返回值:1 表示在,0 表示元素不在或者该 set 不存在
示例:
127.0.0.1:6379> sismember key1 zhangsan
(integer) 1
127.0.0.1:6379> sismember key1 Sam
(integer) 0
127.0.0.1:6379> sismember key2 zhangsan
(integer) 0
scard
获取一个 set 的基数(cardinality),即 set 中元素的个数
scard key
返回值:set 内元素的个数
示例:
127.0.0.1:6379> scard key1
(integer) 4
127.0.0.1:6379> scard key2
(integer) 0
spop
从 set 中删除并返回一个或者多个元素,删除的元素是随机的,源码中就是随机删除
spop key [count]
返回值:删除的元素
示例:
127.0.0.1:6379> smembers key1
1) "three"
2) "two"
3) "one"
4) "wangwu"
5) "zhangsan"
6) "lisi"
7) "zhaoliu"
127.0.0.1:6379> spop key1
"one"
127.0.0.1:6379> spop key1
"two"
127.0.0.1:6379> spop key1
"three"
127.0.0.1:6379> sadd key1 one two three
(integer) 3
127.0.0.1:6379> spop key1
"two"
127.0.0.1:6379> spop key1
"wangwu"
127.0.0.1:6379> spop key1
"one"
smove
将源 set 中的一个元素取出并放到目标 set 中
smove source destination member
返回值:1 表示移动成功,0表示失败
示例:
127.0.0.1:6379> smove key1 key2 zhangsan
(integer) 1
127.0.0.1:6379> smove key1 key2 one
(integer) 0
srem
将指定的元素从 set 中删除
srem key member [member …]
返回值:本次操作删除的元素个数
127.0.0.1:6379> smembers key1
1) "three"
2) "lisi"
3) "zhaoliu"
127.0.0.1:6379> smembers key2
1) "zhangsan"
127.0.0.1:6379> srem key1 three lisi zhangsan
(integer) 2
127.0.0.1:6379> srem key2 one two
(integer) 0
集合间操作
简单介绍一下集合间操作
交集(inter):将两/多个集合中都有元素提取出来
并集(union):将两/多个集合所有的元素提取出来
差集(diff):有顺序差异,sdiff set1 set2
是将 set1 有但 set2 没有的元素提取出来,sdiff set2 set1
则是将 set2 有但 set1 没有的元素提取出来
sinter && sinterstore
sinter
获取两/多个 set 的交集
sinter key [key …]
返回值:交集的元素,同样是无序的
示例:
127.0.0.1:6379> smembers key1
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> smembers key2
1) "e"
2) "d"
3) "c"
127.0.0.1:6379> sinter key1 key2
1) "c"
sinterstore
将获取的交集的元素保存到目标 set 中
sinterstore destination key [key …]
返回值:交集的元素个数
示例:
127.0.0.1:6379> sinter key1 key2
1) "d"
2) "c"
3) "b"
127.0.0.1:6379> sinterstore key3 key1 key2
(integer) 3
127.0.0.1:6379> smembers key3
1) "c"
2) "d"
3) "b"
sunion && sunionstore
sunion
获取两/多个 set 的并集
sunion key [key…]
返回值:并集的元素
示例:
127.0.0.1:6379> smembers key1
1) "d"
2) "c"
3) "a"
4) "b"
127.0.0.1:6379> smembers key2
1) "e"
2) "d"
3) "c"
4) "b"
127.0.0.1:6379> sunion key1 key2
1) "e"
2) "d"
3) "b"
4) "c"
5) "a"
sunionstore
将并集结果保存在目标 set 中
sunionstore destination key [key…]
返回值:并集的元素个数
示例:
127.0.0.1:6379> sunion key1 key2
1) "e"
2) "d"
3) "b"
4) "c"
5) "a"
127.0.0.1:6379> sunion key1 key2 key4
1) "e"
2) "d"
3) "b"
4) "c"
5) "a"
127.0.0.1:6379> sunionstore key4 key1 key2
(integer) 5
127.0.0.1:6379> smembers key4
1) "e"
2) "d"
3) "b"
4) "c"
5) "a"
sdiff && sdiffstore
sdiff
获取集合的差集
sdiff key [key…]
返回值:即只有第一个 set 有,其他 set 没有的元素
示例:
127.0.0.1:6379> sadd key1 a b c d
(integer) 4
127.0.0.1:6379> sadd key2 b c
(integer) 2
127.0.0.1:6379> sadd key3 d
(integer) 1
127.0.0.1:6379> sdiff key1 key2
1) "a"
2) "d"
127.0.0.1:6379> sdiff key1 key2 key3
1) "a"
sdiffstore
将差集的结果保存到目标 set 中
sdiffstore destination key [key…]
返回值:差集的元素个数
示例:
127.0.0.1:6379> sdiff key1 key2 key3
1) "a"
127.0.0.1:6379> sdiffstore key4 key1 key2 key3
(integer) 1
127.0.0.1:6379> smembers key4
1) "a"
内部编码
集合类型的内部编码有两种:
- intset(整数集合):当集合的元素都是整数并且元素的个数小于
set-max-intset-entries
时,Redis 采用 intset 作为集合的内部实现,减少内存的使用 - hashtabel(哈希表):当集合类型无法满足 intset 条件时,Redis 使用 hashtable 作为集合的内部实现
应用场景
集合类型比较典型的使用场景时标签(tag)。例如 A 用户对体育、游戏的内容比较感兴趣,B 用户对新闻、历史感兴趣,这些都是标签。当数据变多后,就可以知道都有什么人有某个标签,他们还有什么其他的共同标签,这些数据对于增强用户体验和用户粘度都非常有帮助。例如电商平台的推送,短视频平台的引流
示例:
- 给用户添加标签
sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag2 tag3 tag5
...
sadd user:k:tags tag1 tag2 tag4
- 给标签添加用户
sadd tag1:users user:1 user:3
sadd tag2:users user:1 user:2 user:3
...
sadd tagk:users user:1 user:4 user:9 user:28
集合间操作
集合所提供的并集、交集、差集操作也可以很好的用于实际。
交集可以用于查看不同用户共有的标签,不同标签共有的用户
并集可以查看一类用户的所有的标签
差集则可以研究不同用户标签的差异化
不允许重复 & 无序
集合没有重复元素,也刚好符合标签的唯一性,便于数据操作。其无序性也体现了标签/爱好的平等
以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。