Redis 7.x 系列【9】数据类型之自动排重集合(Set)

news2025/1/18 4:45:09

有道无术,术尚可求,有术无道,止于术。

本系列Redis 版本 7.2.5

源码地址:https://gitee.com/pearl-organization/study-redis-demo

文章目录

    • 1. 前言
    • 2. 常用命令
      • 2.1 SADD
      • 2.2 SCARD
      • 2.3 SISMEMBER
      • 2.4 SREM
      • 2.5 SSCAN
      • 2.6 SDIFF
      • 2.7 SUNION
      • 2.8 SINTER
      • 2.10 SRANDMEMBER
    • 3. 应用场景
      • 3.1 随机抽奖
      • 3.2 共同关注
      • 3.3 可能认识的人
      • 3.4 点赞

1. 前言

Redis Set 数据类型是一种无序集合,它不允许重复的元素,可以类比 Java 中的 HashSet

2. 常用命令

Set 相关所有命令:

命名描述
SADD向集合添加一个或多个成员
SCARD获取集合的成员数
SDIFF返回给定所有集合的差集
SDIFFSTORE返回给定所有集合的差集并存储在 destination
SINTER返回给定所有集合的交集
SINTERCARD类似于 SINTER,但它不返回结果集,而是只返回结果的基数。返回集合的基数,该基数将由所有给定集合的交集产生
SINTERSTORE返回给定所有集合的交集并存储在 destination
SISMEMBER判断 member 元素是否是集合 key 的成员
SMEMBERS获取一个集合的所有成员
SMISMEMBER从存储在 key 处的集合值中返回一个随机元素
SMOVEmember 元素从 source 集合移动到 destination 集合
SPOP移除并返回集合中的一个随机元素
SRANDMEMBER返回集合中一个或多个随机数
SREM移除集合中一个或多个成员
SSCAN迭代集合中的元素
SUNION返回所有给定集合的并集
SUNIONSTORE所有给定集合的并集存储在 destination 集合中

2.1 SADD

SADD 命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。返回新成功添加到集合里元素的数量,不包括已经存在于集合中的元素。

注意事项:

  • 假如集合 key 不存在,则创建一个只包含被添加的元素作为成员的集合。
  • 当集合 key 不是集合类型时,返回一个错误。
  • Redis 2.4 版本以前, 只接受单个成员值。

基本语法:

SADD key member [member ...]

示例:

redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SADD myset "World"
(integer) 0
redis> SMEMBERS myset
1) "Hello"
2) "World"

2.2 SCARD

SCARD 命令返回集合中元素的数量,当集合 key 不存在时,返回 0

基本语法:

SCARD key

示例:

redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SCARD myset
(integer) 2

2.3 SISMEMBER

SISMEMBER 命令返回存储在 key 中的集合的所有的成员。

注意事项:

  • 不存在的集合被视为空集合
  • 与运行带有一个参数 keySINTER 有同样的效果。

基本语法:

SMEMBERS key

示例:

redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SMEMBERS myset
1) "Hello"
2) "World"

2.4 SREM

SREM 用于在集合中删除指定的元素,返回值为被删除元素个数,不含不存在的元素。

注意事项:

  • 如果指定的元素不是集合成员则被忽略。
  • 如果集合 key 不存在则被视为一个空的集合,该命令返回 0
  • 如果key的类型不是一个 Set ,则返回 ERR WRONGTYPE Operation against a key holding the wrong kind of value 错误。

基本语法:

SREM key member [member ...]

示例:

redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myset "three"
(integer) 1
redis> SREM myset "one"
(integer) 1
redis> SREM myset "four"
(integer) 0
redis> SMEMBERS myset
1) "two"
2) "three"

2.5 SSCAN

SSCAN 命令用于遍历集合中键的元素,继承自 SCAN

基本语法:

SSCAN key cursor [MATCH pattern] [COUNT count]

命令参数:

  • cursor:游标。
  • pattern :匹配的模式。
  • count :指定从数据集里返回多少元素,默认值为 10

示例:

> SADD myset1 "Google"
(integer) 1
> SADD myset1 "Redis"
(integer) 1
> SADD myset1 "Taobao"
(integer) 1
> SSCAN myset1 0 match R*
1) "0"
2) 1) "Redis"

2.6 SDIFF

SDIFF 命令返回第一个集合与其他集合之间的差异,也可以认为说第一个集合中独有的元素。不存在的集合 key 将视为空集。

基本语法:

SDIFF key [key ...]

示例:

redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SDIFF key1 key2
1) "a"
2) "b"

2.7 SUNION

SUNION 命令用于返回所有给定集合的并集。

基本语法:

SUNION key [key ...]

示例:

redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SUNION key1 key2
1) "b"
2) "c"
3) "a"
4) "d"
5) "e"

2.8 SINTER

SINTER 返回所有给定集合的成员交集。

基本语法:

SINTER key [key ...]

示例:

redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SINTER key1 key2
1) "c"

2.10 SRANDMEMBER

SRANDMEMBER 命令随机返回集合 key 中的一个或多个随机元素。

注意事项:

  • 如果 key 不存在则返回 nil
  • 使用 count 参数,则返回一个随机的元素数组,如果 key 不存在则返回一个空的数组。

基本语法:

SRANDMEMBER key [count]

示例:

redis> SADD myset one two three
(integer) 3
redis> SRANDMEMBER myset
"two"
redis> SRANDMEMBER myset 2
1) "two"
2) "three"
redis> SRANDMEMBER myset -5
1) "one"
2) "three"
3) "two"
4) "one"
5) "two"

3. 应用场景

Set 数据类型除了普通的存储功能外,还提供了交集、并集、差集操作,可用于以下场景:

  • 抽奖系统、随机点名
  • 共同关注、共同粉丝、共同喜好、共同好友等
  • 数据不能重复的场景,例如点赞
  • 可能认识的人

3.1 随机抽奖

在这里插入图片描述

用户点击参与抽奖时,添加到抽奖集合中:

localhost:0>SADD join_user_set 1
"1"
localhost:0>SADD join_user_set 2
"1"
localhost:0>SADD join_user_set 3
"1"

查看抽奖总参与人数:

localhost:0>SCARD join_user_set
"3"

随机抽取两人(不删除元素):

localhost:0>SRANDMEMBER key 2

随机抽取两人(删除元素):

localhost:0>SRANDMEMBER join_user_set 2

3.2 共同关注

在这里插入图片描述
我的关注:

localhost:0>SADD my_follow_set u1 u2 u3 
"3"

贾乃亮的关注:

localhost:0>SADD jianailiang_follow_set u2 u3 u4
"3"

查看共同关注:

localhost:0>SINTER my_follow_set  jianailiang_follow_set
 1)  "u2"
 2)  "u3"

3.3 可能认识的人

在社交平台中,添加好友时,系统会推荐可能认识的人,例如抖音:

在这里插入图片描述
例如快手:
在这里插入图片描述

一般有以下规则:

  • 手机号匹配:社交平台都要求使用手机号注册,在读取你的通讯录后,会根据通讯录手机号查询用户
  • 附近的人:通过定位权限获取定理位置,并筛选出附近的人
  • 好友差集:计算用户之间的共同好友,如果共同好友超过一定数量,说明两个人是同一个圈子的人,例如同一个班级,两个学生之间的共同好友肯定很多。然后通过计算两人好友之间的差集,进行推荐
  • 标签:例如通过相同的兴趣爱好进行推荐

例如,当前我的好友列表:

localhost:0>SADD my_friend_set u1 u2 u3 u5 
"4"

我的好友 u1 的好友列表:

localhost:0>SADD u1_frieng_set  u1 u2 u3 u6
"4"

我和 u1 的共同好友:

localhost:0>SINTER my_friend_set u1_frieng_set
 1)  "u1"
 2)  "u2"
 3)  "u3"

将我有但是 u1 没有的好友推荐给 u1

localhost:0>SDIFF u1_frieng_set my_friend_set
 1)  "u5"

u1 有但是我没有的好友推荐给我:

localhost:0>SDIFF  my_friend_set u1_frieng_set
 1)  "u6"

3.4 点赞

在这里插入图片描述
新增点赞用户:

localhost:0>SADD msg_1 u1 u2
"2"

取消点赞:

localhost:0>SREM msg_1 u1
"1"

查看所有点赞用户:

localhost:0>SMEMBERS msg_1
 1)  "u2"

查看点赞总数:

localhost:0>SCARD msg_1
"1"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1881360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试 - 启动多任务排序 - 拓扑排序(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(D卷C卷A卷B卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测…

如何做好一个企业家IP:塑造独特的个人品牌

在当今数字化时代,个人品牌的力量愈发凸显,对于企业家而言,一个强大的IP(Intellectual Property,即知识产权或个人品牌)不仅有助于提升个人影响力,还能为企业的发展注入强大动力。那么&#xff…

BGE M3-Embedding 模型介绍

BGE M3-Embedding来自BAAI和中国科学技术大学,是BAAI开源的模型。相关论文在https://arxiv.org/abs/2402.03216,论文提出了一种新的embedding模型,称为M3-Embedding,它在多语言性(Multi-Linguality)、多功能…

Feign 原理流程图练习-01

目录 作业: 老师给的参考流程图 要求 解答 知识扩展 Feign基础原理 接口定义 代理对象生成 请求调用 请求发送 响应处理 容错与熔断 总结 作业: 老师给的参考流程图 pdf版本 【金山文档 | WPS云文档】 Feign https://kdocs.cn/l/ctbagIyxN348 ​ 要求 结合上面…

[C++][设计模式][状态模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受1.代码一2.代码二 1.动机 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而放生变化 比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同 如何在运行时根据对象的状…

STM32 SWD烧写

最小电路 stm32f103x 内部已经集成了振荡电路,可以省略;rst引脚电路,可以省略,boot0,boot1不需要设置 正常烧录 -------------------------------------------------------------------STM32CubeProgrammer v2.9.0 …

antd Select前端加模糊搜索

背景&#xff1a;前端的小伙伴经常在开发antd Select的时候后端不提供搜索模糊搜索接口&#xff0c;而是全量返回数据&#xff0c;这个时候就需要我们前端自己来写一个模糊搜索了。 效果 代码截图 代码 <SelectshowSearchmode"multiple"options{studioList}filte…

读AI新生:破解人机共存密码笔记17不确定性和概率

1. 前向搜索 1.1. 通过前向搜索&#xff0c;通过考虑各种可能的动作序列的结果&#xff0c;来选择动作&#xff0c;是智能系统的基本能力 1.2. 如果一家卡车运输公司想要优化其100辆卡车在美国的运输&#xff0c;那么该公司可能需要考虑的状态数量将是10^700个 1.3. 几乎所有…

leetcode 第133场双周赛 100333.统计逆序对的数目【计数dp/滚动数组/前缀和优化】

分析&#xff1a; 先考虑如下问题。 求长度为n&#xff0c;逆序对为m的排列数量。 可以考虑dp&#xff0c;dp[i][j]定义为长度为i&#xff0c;逆序对为j的排列数量。 dp[1][0] 1; //枚举排列长度&#xff0c;或者认为枚举当前需要插到长度为i-1的排列中的数字 for(int i 1…

Mini-Contract电子合同在线签署小程序源码

Mini-Contract电子合同在线签署小程序源码&#xff0c;采用的是uniapp Vue3框架搭建&#xff0c;只有前端源码是一个聚合市场上各类电子合同解决方案商的工具&#xff0c;让用户无需一个个对接电子合同厂商&#xff0c;节省时间和精力。该程序提供了简洁的代码和最新的技术栈&a…

C++ | Leetcode C++题解之第208题实现Trie(前缀树)

题目&#xff1a; 题解&#xff1a; class Trie { private:vector<Trie*> children;bool isEnd;Trie* searchPrefix(string prefix) {Trie* node this;for (char ch : prefix) {ch - a;if (node->children[ch] nullptr) {return nullptr;}node node->children[…

现代信息检索笔记(二)

目录 信息检索概述 IR vs数据库: 结构化vs 非结构化数据 结构化数据 非结构化数据 半结构化数据 传统信息检索VS现代信息检索 布尔检索 倒排索引 一个例子 建立词项&#xff08;可以是字、词、短语、一句话&#xff09;-文档的关联矩阵。 关联向量 检索效果的评价 …

【IVI】car_service 命令行工具

【IVI】car_service 命令行工具 1、car_service服务执行2、CarShellCommand命令执行2.1 cmd car_service day-night-mode day设置白天模式2.2 cmd car_service inject-vhal-event vhal信号事件2.2.1 VehiclePropertyIds2.2.2 模拟驾驶事件 2.3 cmd car_service inject-error-ev…

STM32MP135裸机编程:使用软件触发硬件复位

0 参考资料 STM32MP13xx参考手册.pdf 1 使用寄存器实现软件复位 1.1 复位电路概述 重点关注下面标红的路线&#xff1a; 通过这条路线可以清楚看到&#xff0c;我们可以通过设置RCC_MP_GRSTCSETR寄存器让RPCTL&#xff08;复位脉冲控制器&#xff09;给NRST&#xff08;硬件复…

hmall-服务保护和分布式事务

1. 微服务保护 1.1 服务保护方案 1.1.1 请求限流 服务故障最重要原因&#xff0c;就是并发太高&#xff01;解决了这个问题&#xff0c;就能避免大部分故障。当然&#xff0c;接口的并发不是一直很高&#xff0c;而是突发的。因此请求限流&#xff0c;就是限制或控制接口访问…

常见容性负载组应用

什么是容性负载&#xff1f; 在交流系统中&#xff0c;电压和电流随电源的频率而上升和下降。电压和电流是否一起上升取决于负载的特性&#xff0c;负载有三种类型。电阻负载&#xff08;例如加热元件和白炽灯&#xff09;的影响最小&#xff0c;电压和电流一起上升和下降&…

Vue3学习笔记<->创建第一个vue项目(2)

新建一个项目目录 找一个盘新建一个目录&#xff0c;我这里在D盘创建一个vuedemo目录作为项目存放的目录。使用idea打开目录。   单击ieda底部的按钮“Terminal”&#xff0c;打开命令行窗口&#xff0c;如果命令行窗口当前目录不是“vuedemo”&#xff0c;就切换到“vuedem…

九浅一深Jemalloc5.3.0 -- ②浅*size class

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但5.3.0却少之又少。而且5.3.0的架构与之前的版本也有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析Jemalloc5.3.0的实现。 另外&#xff0c;单讲实现代码是极其枯燥的&#xff0c;…

web渗透-反序列化漏洞

一、简介 就是把一个对象变成可以传输的字符串&#xff0c;目的就是为了方便传输。假设&#xff0c;我们写了一个class,这个class里面存有一些变量。当这个class被实例化了之后&#xff0c;在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到这个变量&#xff0…

压缩包怎么解压,解压压缩包不损坏文件

常见格式&#xff1a; ZIP&#xff1a;最常见的压缩文件格式之一&#xff0c;支持跨平台。RAR&#xff1a;另一种常见的压缩文件格式&#xff0c;通常压缩率比ZIP高&#xff0c;但不如ZIP普及。7Z&#xff1a;来自7-Zip的压缩格式&#xff0c;支持更高的压缩率和一些高级特性。…