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

【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

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

不允许重复 & 无序

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


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

http://www.xdnf.cn/news/10643.html

相关文章:

  • Python列表、字典、元组、集合
  • 推荐一款使用html开发桌面应用的工具——mixone
  • 39. 组合总和【 力扣(LeetCode) 】
  • 从万物互联到万体智联:论智能体互联网带来的产业革命
  • 可视化大屏如何制作
  • SQL快速入门【转自牛客网】
  • 强人工智能 vs 弱人工智能:本质区别与未来展望
  • CppCon 2014 学习:Defensive Programming Done Right.
  • 嵌入式Linux 期末复习指南(下)
  • Java递归编程中的StackOverflowError问题分析与解决方案
  • 软件测评师教程 第9章 基于质量特性的测试与评价 笔记
  • 新版智慧社区(小区)智能化弱电系统解决方案
  • 记录一次由打扑克牌测试国内各家大模型的经历
  • 序列搜索策略
  • 探秘 Minimax:AI 领域的创新先锋
  • CangjieMagic 智能体框架嵌入式系统实测:以树莓派 4B 为例
  • 【Redis技术进阶之路】「系统架构系列中篇」高可用之Master-Slave主从架构的复制问题(分析旧版点制功能)
  • rabbitmq Direct交换机简介
  • K-匿名模型
  • 强类型语言和弱类型语言
  • 振动力学:有阻尼单自由度系统
  • 极客时间:用 FAISS、LangChain 和 Google Colab 模拟 LLM 的短期与长期记忆
  • RNN循环网络:给AI装上“记忆“(superior哥AI系列第5期)
  • 房屋租赁系统 Java+Vue.js+SpringBoot,包括房屋类型、房屋信息、预约看房、合同信息、房屋报修、房屋评价、房主管理模块
  • 洛谷-P3912素数个数题解
  • 模型训练的“隐形杀手”——过拟合!全面解析与实用应对方案
  • MySQL中的锁
  • 【nssctf第三题】[NSSCTF 2022 Spring Recruit]easy C
  • 29 C 语言内存管理与多文件编程详解:栈区、全局静态区、static 与 extern 深度解析
  • Codeforces Round 1026 (Div. 2) C. Racing