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 处的集合值中返回一个随机元素
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_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"

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海云安参编《数字安全蓝皮书 》正式发布并入选《2024中国数字安全新质百强》荣膺“先行者”

近日,国内数字化产业第三方调研与咨询机构数世咨询正式发布了《2024中国数字安全新质百强》(以下简称百强报告)。海云安凭借在开发安全领域的技术创新力及市场影响力入选百强报告“新质百强先行者” 本次报告,数世咨询经过对国内8…

以算筑基,以智赋能 | Gooxi受邀出席2024中国智算中心全栈技术大会

6月25日,2024中国智算中心全栈技术大会暨展览会、第5届中国数据中心绿色能源大会暨第10届中国(上海)国际数据中心产业展览会在上海新国际博览中心隆重召开。Gooxi受邀参与并携最新服务器产品以及解决方案亮相展会,吸引众多行业领袖…

C++学习/复习18----迭代器/反向迭代器及在list/vector中的应用、list与vector模拟实现复习

迭代器是一个对象,可以循环访问 C 标准库容器中的元素,并提供对各个元素的访问。 C 标准库容器全都提供迭代器,以便算法可以采用标准方式访问其元素,而不必考虑用于存储元素的容器类型。 一、反向迭代器类 基于普通迭代器构建反…

亚太杯赛题思路发布(中文版)

导读: 本文将继续修炼回归模型算法,并总结了一些常用的除线性回归模型之外的模型,其中包括一些单模型及集成学习器。 保序回归、多项式回归、多输出回归、多输出K近邻回归、决策树回归、多输出决策树回归、AdaBoost回归、梯度提升决策树回归…

Java进阶-try-with-resources

Java进阶-try-with-resources try-with-resources 是什么传统使用try-catch-finally关闭资源使用try-with-resources什么时候用 try-with-resources 是什么 try-with-resources 是 Java 7 中引入的一个新特性,用于简化资源管理,一般是用于处理实现了 Au…

大模型+多模态合规分析平台,筑牢金融服务安全屏障

随着金融市场的快速发展,金融产品和服务日趋多样化,消费者面临的风险也逐渐增加。 为保护消费者权益,促进金融市场长期健康稳定发展,国家监管机构不断加强金融监管,出台了一系列法律法规和政策文件。对于金融从业机构…

设计模式-状态模式和策略模式

1.状态模式 1.1定义 当一个对象的内在状态改变时允许根据当前状态作出不同的行为; 1.2 适用场景 (1)一个对象的行为取决于它的状态,并且它必须在运行时根据状态来决定其行为. (2)代码中包含了大量的与状态有关的条件语句,例如:一个操作含有庞大的多分值语句(if…

对原生input加上:当前输入字数/最大输入字数

源码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* 样式…

商城自动化测试实战 —— 登录+滑块验证

hello大家好&#xff0c;我是你们的小编&#xff01; 本商城测试项目采取PO模型和数据分离式架构&#xff0c;采用pytestseleniumjenkins结合的方式进行脚本编写与运行&#xff0c;项目架构如下&#xff1a; 1、创建项目名称&#xff1a;code_shopping&#xff0c;创建所需项目…

常微分方程算法之编程示例五(阿当姆斯法)

目录 一、研究问题 二、C++代码 三、计算结果 一、研究问题 本节我们采用阿当姆斯法(Adams法)求解算例。 阿当姆斯法的原理及推导请参考: 常微分方程算法之阿当姆斯法(Adams法)_四步四阶adams显格式;三步四阶adams隐格式;四阶adams预估-校正格式-CSDN博客https://blog…

Linux系统编程--进程间通信

目录 1. 介绍 1.1 进程间通信的目的 1.2 进程间通信的分类 2. 管道 2.1 什么是管道 2.2 匿名管道 2.2.1 接口 2.2.2 步骤--以父子进程通信为例 2.2.3 站在文件描述符角度-深度理解 2.2.4 管道代码 2.2.5 读写特征 2.2.6 管道特征 2.3 命名管道 2.3.1 接口 2.3.2…

Nginx中封装的数据结构

Nginx中封装的数据结构 Nginx中封装的数据结构整型ngx_str_t【字符串】ngx_list_t【链表】ngx_table_elt_t【key/value】ngx_buf_tngx_chain_t Nginx中封装的数据结构 整型 typedef intptr_t ngx_int_t; typedef uintptr_t ngx_uint_t;ngx_str_t【字符串】 typ…

【面试题】信息系统安全运维要做什么

信息系统安全运维是确保信息系统稳定、可靠、安全运行的一系列活动和措施。 其主要包括以下几个方面&#xff1a; 1.系统监控&#xff1a; 实时监测信息系统的运行状态&#xff0c;如服务器的性能指标、网络流量、应用程序的运行情况等。通过监控工具&#xff0c;及时发现系统…

What does the error ‘module ‘langchain‘ has no attribute ‘verbose‘ refer to?

题意&#xff1a;错误 module langchain has no attribute verbose 指的是什么意思&#xff1f; 问题背景&#xff1a; Kind of new to Langchain/Qdrant but Im building a recommendation engine to recommend users based on the contents of their associated PDF files, …

typora取消源代码模式

如果typora不小心设置成了源代码模式 关闭源代码模式&#xff1a;

Django-开发一个列表页面

需求 基于ListView,创建一个列表视图,用于展示"BookInfo"表的信息要求提供分页提供对书名,作者,描述的查询功能 示例展示: 1. 数据模型 models.py class BookInfo(models.Model):titlemodels.CharField(verbose_name"书名",max_length100)authormode…

git 用户名密码Clone代码

#密码中包含&#xff0c;则使用%40代表 cd /disk03/wwwroot/GitDemo/BuildTemp && git clone -b dev --single-branch http://root:test%40123192.168.31.104/root/SaaS.Auto.Api.git git pull origin dev 今天使用LibGit2Sharp在Linux上Clone代码时报错&#xff0c;因…

使用 go-control-plane 自定义服务网格控制面

写在前面 阅读本文需要最起码了解envoy相关的概念 本文只是一个类似于demo的测试&#xff0c;只为了学习istio&#xff0c;更好的理解istio中的控制面和数据面&#xff08;pilot -> proxy&#xff09;是如何交互的&#xff0c;下图的蓝色虚线 先说go-control-plane是什么…

MySQL高级-MVCC-原理分析(RC级别)

文章目录 1、RC隔离级别下&#xff0c;在事务中每一次执行快照读时生成ReadView2、先来看第一次快照读具体的读取过程&#xff1a;3、再来看第二次快照读具体的读取过程: 1、RC隔离级别下&#xff0c;在事务中每一次执行快照读时生成ReadView 我们就来分析事务5中&#xff0c;两…

柯桥法语学习|学点黑话!法语中的「钱」可不止“argent”

法语中有哪些关于钱的“黑话”&#xff1f;一起来和法语君看一下吧&#xff01; bl 之所以繁杂&#xff0c;是因为这些词在诞生之初&#xff0c;不止涉及一个故事&#xff0c;而是一大堆小轶事&#xff0c;以“bl”指钱的起源如迷宫般复杂。 根据Trsor de la langue frana15857…