Redis 7.x 系列【9】数据类型之自动排重集合(Set)
有道无术,术尚可求,有术无道,止于术。
本系列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 处的集合值中返回一个随机元素 |
| SMOVE | 将 member 元素从 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 中的集合的所有的成员。
注意事项:
- 不存在的集合被视为空集合
- 与运行带有一个参数
key的SINTER有同样的效果。
基本语法:
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_set1) "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_set1) "u1"2) "u2"3) "u3"
将我有但是 u1 没有的好友推荐给 u1 :
localhost:0>SDIFF u1_frieng_set my_friend_set1) "u5"
将 u1 有但是我没有的好友推荐给我:
localhost:0>SDIFF my_friend_set u1_frieng_set1) "u6"
3.4 点赞

新增点赞用户:
localhost:0>SADD msg_1 u1 u2
"2"
取消点赞:
localhost:0>SREM msg_1 u1
"1"
查看所有点赞用户:
localhost:0>SMEMBERS msg_11) "u2"
查看点赞总数:
localhost:0>SCARD msg_1
"1"
相关文章:
Redis 7.x 系列【9】数据类型之自动排重集合(Set)
有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 前言2. 常用命令2.1 SADD2.2 SCARD2.3 SISMEMBER2.4 SREM2.5 SSCAN2.6 SDIFF2.7 SU…...
【LeetCode】每日一题:反转链表
题解思路 循环的方法需要注意prev应该是None开始,然后到结束的时候prev是tail,递归的思路很难绕过弯来,主要在于很难想清楚为什么可以返回尾节点,需要多做递归题,以及递归过程中,可以不使用尾节点来找当前…...
使用Spring Boot创建自定义Starter
使用Spring Boot创建自定义Starter 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何使用Spring Boot创建自定义Starter,来简化项目…...
cmd设置编码为utf8
文章目录 临时设置永久设置(通过注册表) cmd命令乱码,解决方案比较简单。 输入chcp, 如果返回的是936,通常是GBK或CP936。 如果返回的是65001,表示是UTF-8。 临时设置 chcp 65001 # 设置 chcp # 查看 永久设置(通过注册表) 打…...
一次关于k8s的node节点NotReady的故障排查
master现象 分析 kubectl get nodes -A 看了下pod的状态,好多CrashLoopBackOff kubectl get nodes -o wide 定位到那个具体node的IP地址,登录对应的IP去查看为什么会这样 node节点 journalctl -xe -f -u kubelet 查看此节点的 kubelet 服务ÿ…...
Java变量与标识符
一、关键字(Keyboard) 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(或单词) 特点:全部关键字都是小写字母 官方地址: https://docs.oracle.com/javase/tutorial/java/nut…...
AWS无服务器 应用程序开发—第十七章 AWS用户池案例
在AWS Cognito用户池中,用户属性可以根据应用程序的需求进行配置和管理。以下是一般情况下用户属性的一些常见设置: 必须的属性: 用户名(Username):通常用作用户的唯一标识符。 密码(Password…...
java中的枚举
第1部分:引言 枚举在Java中的重要性 枚举在Java中扮演着至关重要的角色,它不仅提高了代码的可读性和可维护性,还增强了类型安全。枚举的使用可以避免使用魔法数字或散列常量,这些在代码中通常难以理解和维护。通过枚举ÿ…...
各种开发语言运行时占用内存情况比较
随着科技的发展,编程语言种类繁多,不同的编程语言在运行时的内存占用情况各不相同。了解这些差异对于开发者选择合适的编程语言尤为重要。本文将讨论几种主流编程语言在运行时的内存占用情况,包括C、C、Java、Python和Go等。 1. C语言 内存…...
【基础知识10】label与input标签
label标签说明 HTML元素表示用户界面中某个元素的说明 将一个和一个元素相关联主要有这些优点: 标签文本不仅与其相应的文本输入元素在视觉上相关联,程序中也是如此。这意味着,当用户聚焦到这个表单输入元素时,屏幕阅读器可以读…...
【SDV让汽车架构“和而不同”】
昔日以“排气管数量”和“发动机动力”为骄傲的荣耀已然成为过往。在这个崭新的时代,特斯拉、理想、蔚来、小鹏、零跑等新兴的汽车制造商纷纷推出了搭载可交互大屏、实现万物互联、软件功能持续更新的新车型,它们被誉为“车轮上的智能手机”。同时&#…...
面试经验分享 | 驻场安全服务工程师面试
所面试的公司:某安全厂商 所在城市:浙江宁波 面试职位:驻场安全服务工程师 面试官的问题: 1、信息收集如何处理子域名爆破的泛解析问题? 泛域名解析是:*.域名解析到同一IP。域名解析是:子域…...
SpringBoot 学习笔记
文章目录 SpringBoot1 SpringBoot 的纯注解配置(了解)1.1 环境搭建1.1.1 jdbc配置1.1.2 mybatis配置1.1.3 transactional配置1.1.4 service配置1.1.5 springmvc配置1.1.6 servlet配置1.1.7 存在的问题 1.2 新注解说明1.2.1 Configuration1.2.2 Component…...
Android 13 为应用创建快捷方式
参考 developer.android.google.cn 创建快捷方式 来自官网的说明: 静态快捷方式 :最适合在用户与应用互动的整个生命周期内使用一致结构链接到内容的应用。由于大多数启动器一次仅显示四个快捷方式,因此静态快捷方式有助于以一致的方式执行…...
PTA—C语言期末复习(选择题)
1. 按照标识符的要求,(A)不能组成标识符。 A.连接符 B.下划线 C.大小写字母 D.数字字符 在大多数编程语言中,标识符通常由字母(包括大写和小写)、数字和下划线组成,但不能以数字开头,…...
基于STM32的智能家用空气净化系统
目录 引言环境准备智能家用空气净化系统基础代码实现:实现智能家用空气净化系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景:空气净化管理与优化问题解决方案与优化收尾与总结 1. 引言 智能家用空气净化系…...
计算机图形学入门18:阴影映射
1.前言 前面几篇关于光栅化的文章中介绍了如何计算物体表面的光照,但是着色并不会进行阴影的计算,阴影需要单独进行处理,目前最常用的阴影计算技术之一就是Shadow Mapping技术,也就是俗称的阴影映射技术。 2.阴影映射 Shadow Map…...
电机应用相关名词介绍
1.电机转速 定义:电机转速指电机工作时旋转的速度,是衡量电机性能的重要指标之一。 单位: 每分钟转数(RPM):即Revolutions Per Minute,表示电机每分钟旋转的圈数。 每秒转数(RPS…...
哈尔滨等保测评解读
哈尔滨的信息系统安全等级保护测评(简称“等保测评”)是中国网络安全法规的一部分,旨在确保关键信息基础设施和其他重要信息系统的安全。下面是对哈尔滨等保测评的解读: 测评目的 等保测评的主要目的是评估信息系统是否满足国家规…...
python接口自动化的脚本
使用Requests库进行GET请求 Requests是Python中最常用的HTTP库,用于发送HTTP请求。下面是一个简单的GET请求示例,用于从API获取数据。 import requests url = "https://api.example.com/data" response = requests.get(url) if response.status_code == 200:prin…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...
EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势
一、WebRTC与智能硬件整合趋势 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...
VSCode 使用CMake 构建 Qt 5 窗口程序
首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...
夏普比率(Sharpe ratio)
具有投资常识的人都明白,投资光看收益是不够的,还要看承受的风险,也就是收益风险比。 夏普比率描述的正是这个概念,即每承受一单位的总风险,会产生多少超额的报酬。 用数学公式描述就是: 其中࿱…...
