当前位置: 首页 > news >正文

【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 用户对新闻、历史感兴趣,这些都是标签。当数据变多后,就可以知道都有什么人有某个标签,他们还有什么其他的共同标签,这些数据对于增强用户体验和用户粘度都非常有帮助。例如电商平台的推送,短视频平台的引流

示例:

  1. 给用户添加标签
sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag2 tag3 tag5
...
sadd user:k:tags tag1 tag2 tag4
  1. 给标签添加用户
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

集合间操作
集合所提供的并集、交集、差集操作也可以很好的用于实际。
交集可以用于查看不同用户共有的标签,不同标签共有的用户
并集可以查看一类用户的所有的标签
差集则可以研究不同用户标签的差异化

不允许重复 & 无序

集合没有重复元素,也刚好符合标签的唯一性,便于数据操作。其无序性也体现了标签/爱好的平等


以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

相关文章:

  • AI Agent企业级生产应用全解析
  • Flask中secret_key设置解析
  • 振动分析师(ISO18436-2)四级能力矩阵 - 简介
  • 齐次变换矩阵与运动旋量的指数映射
  • 如何学习才能更好地理解人工智能工程技术专业和其他信息技术专业的关联性?
  • Vue3(watch,watchEffect,标签中ref的使用,TS,props,生命周期)
  • DAY43打卡
  • Github 2025-06-02 开源项目周报 Top11
  • 效率办公Office 2003-2024网盘下载与安装教程指南
  • 【Pytorch学习笔记】模型模块07——hook实现Grad-CAM
  • pbootcms 搜索自定义字段模糊、精准搜索
  • 如何自定义WordPress主题(5个分步教程)
  • Pycharm的终端无法使用Anaconda命令行问题详细解决教程
  • 【CVE-2025-4123】Grafana完整分析SSRF和从xss到帐户接管
  • 字节跳动开源图标库:2000+图标一键换肤的魔法
  • unidbg patch 初探 微博deviceId 案例
  • CSP使用严格设置
  • 电脑桌面便签软件哪个好?桌面好用便签备忘录推荐
  • OpenCV4.4.0下载及初步配置(Win11)
  • 一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录——3. 服务器软件更新,以及常用软件安装
  • 个人网站隐藏服务器真实ip/公众号软文是什么意思
  • 网站开发什么是会话/产品营销推广策略
  • 学做网站需要多久/企业推广公司
  • 正规网站建设多少费用/推广普通话作文
  • 免费网站空间怎么/湖北网站seo
  • 做网站具体流程/软文营销的特点