【Redis】Redis十大数据类型—集合set

news2024/10/3 3:26:01

介绍

set类型是一个无序并唯一的键值集合,set的存储顺序不会按照插入的先后顺序进行存储。

一个集合最多可以存储2^32-1个元素。

set类型除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集。

dd46f18f087da7d2171e4d1f6845d8c0.png

Set 类型和 List 类型的区别如下:

  • List 可以存储重复元素,Set 只能存储非重复元素;
  • List 是按照元素的先后顺序存储元素的,而 Set 则是无序方式存储元素的。

常用命令

在这里插入图片描述

示例

SADD

SADD key member [member ...]

往集合key中存入元素,元素存在则忽略,若不存在则新建

127.0.0.1:6379> SADD k1 v1 v2 v3
(integer) 3
127.0.0.1:6379> SADD k1 v1 v2 v3
(integer) 0

SMEMBERS

SMEMBERS key

遍历集合中的所有元素

127.0.0.1:6379> SADD k1 v1 v2 v3
(integer) 3
127.0.0.1:6379> SMEMBERS k1
1) "v3"
2) "v2"
3) "v1"

SISMEMBER

SISMEMBER key member

判断元素是否在集合中

127.0.0.1:6379> SISMEMBER k1 v4
(integer) 0
127.0.0.1:6379> SISMEMBER k1 v2
(integer) 1

SREM

SREM key member [member ...]

删除元素

127.0.0.1:6379> SMEMBERS k1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> SREM k1 v1
(integer) 1
127.0.0.1:6379> SMEMBERS k1
1) "v3"
2) "v2"

SCARD

SCARD key

获取集合里面的元素个数

127.0.0.1:6379> SMEMBERS k1
1) "v3"
2) "v2"
127.0.0.1:6379> SCARD k1
(integer) 2

SRANDMEMBER

SRANDMEMBER key number

从集合中随机展现设置的数字个数元素,元素不删除

127.0.0.1:6379> SRANDMEMBER k1 2
1) "v3"
2) "v2"
127.0.0.1:6379> SRANDMEMBER k1 3
1) "v3"
2) "v2"

SPOP

SPOP key [count]

从集合中随机弹出一个元素,出一个删一个

127.0.0.1:6379> SMEMBERS k2
1) "c"
2) "v2"
3) "b"
4) "a"
127.0.0.1:6379> SPOP k2 1
1) "a"
127.0.0.1:6379> SMEMBERS k2
1) "c"
2) "v2"
3) "b"

SMOVE

SMOVE source destination member

将source 里已存在的某个值赋给destination

127.0.0.1:6379> SADD k2 a b c
(integer) 3
127.0.0.1:6379> SMOVE k1 k2 v2
(integer) 1
127.0.0.1:6379> SMEMBERS k2
1) "c"
2) "v2"
3) "b"
4) "a"

SINTER

SINTER key [key ...]

交集运算

127.0.0.1:6379> SINTER A B
1) "1"
2) "a"
3) "2"

SINTERSTORE

SINTERSTORE destination key [key ...]

将交集结果存入新集合destination中

127.0.0.1:6379> SINTERSTORE C A B
(integer) 3
127.0.0.1:6379> SMEMBERS C
1) "2"
2) "1"
3) "a"

SUNION

SUNION key [key ...]

并集运算

127.0.0.1:6379> SUNION A B
1) "3"
2) "1"
3) "2"
4) "c"
5) "x"
6) "b"
7) "a"

SUNIONSTORE

SUNIONSTORE destination key [key ...]

将并集结果存入新集合destination中

127.0.0.1:6379> SUNIONSTORE D A B
(integer) 7
127.0.0.1:6379> SMEMBERS D
1) "3"
2) "1"
3) "2"
4) "c"
5) "x"
6) "b"
7) "a"

SDIFF

SDIFF key [key ...]

差集运算,属于A但不属于B的元素构成的集合

127.0.0.1:6379> SADD A a b c 1 2
(integer) 5
127.0.0.1:6379> SADD B 1 2 3 a x
(integer) 5
127.0.0.1:6379> SDIFF A B
1) "c"
2) "b"

SINTERCARD

SINTERCARD numkeys key [key ...] [LIMIT limit]

它不返回结果集,而只返回结果的基数。
返回由所有给定集合的交集产生的集合的基数。

127.0.0.1:6379> SINTERCARD 2 A B
(integer) 3
127.0.0.1:6379> SINTERCARD 2 A B limit 1 #limit限制个数
(integer) 1
127.0.0.1:6379> SINTERCARD 2 A B limit 2
(integer) 2
127.0.0.1:6379> SINTERCARD 2 A B limit 3
(integer) 3
127.0.0.1:6379> SINTERCARD 2 A B limit 4
(integer) 3

应用场景

集合的主要几个特性,无序、不可重复、支持并交差等操作。

因此 Set 类型比较适合用来数据去重和保障数据的唯一性,还可以用来统计多个集合的交集、错集和并集等,当我们存储的数据是无序并且需要去重的情况下,比较适合使用集合类型进行存储。

但是要提醒一下,这里有一个潜在的风险。Set 的差集、并集和交集的计算复杂度较高,在数据量较大的情况下,如果直接执行这些计算,会导致 Redis 实例阻塞

在主从集群中,为了避免主库因为 Set 做聚合计算(交集、差集、并集)时导致主库被阻塞,我们可以选择一个从库完成聚合统计,或者把数据返回给客户端,由客户端来完成聚合统计。

点赞

Set 类型可以保证一个用户只能点一个赞,这里举例子一个场景,key 是文章id,value 是用户id。

uid:1uid:2uid:3 三个用户分别对 article:1 文章点赞了。

# uid:1 用户对文章 article:1 点赞
> SADD article:1 uid:1
(integer) 1
# uid:2 用户对文章 article:1 点赞
> SADD article:1 uid:2
(integer) 1
# uid:3 用户对文章 article:1 点赞
> SADD article:1 uid:3
(integer) 1

uid:1 取消了对 article:1 文章点赞。

> SREM article:1 uid:1
(integer) 1

获取 article:1 文章所有点赞用户 :

> SMEMBERS article:1
1) "uid:3"
2) "uid:2"

获取 article:1 文章的点赞用户数量:

> SCARD article:1
(integer) 2

判断用户 uid:1 是否对文章 article:1 点赞了:

> SISMEMBER article:1 uid:1
(integer) 0  # 返回0说明没点赞,返回1则说明点赞了

共同关注

Set 类型支持交集运算,所以可以用来计算共同关注的好友、公众号等。

key 可以是用户id,value 则是已关注的公众号的id。

uid:1 用户关注公众号 id 为 5、6、7、8、9,uid:2 用户关注公众号 id 为 7、8、9、10、11。

# uid:1 用户关注公众号 id 为 56789
> SADD uid:1 5 6 7 8 9
(integer) 5
# uid:2  用户关注公众号 id 为 7891011
> SADD uid:2 7 8 9 10 11
(integer) 5

uid:1uid:2 共同关注的公众号:

# 获取共同关注
> SINTER uid:1 uid:2
1) "7"
2) "8"
3) "9"

uid:2 推荐 uid:1 关注的公众号:

> SDIFF uid:1 uid:2
1) "5"
2) "6"

验证某个公众号是否同时被 uid:1uid:2 关注:

> SISMEMBER uid:1 5
(integer) 1 # 返回0,说明关注了
> SISMEMBER uid:2 5
(integer) 0 # 返回0,说明没关注

抽奖活动

存储某活动中中奖的用户名 ,Set 类型因为有去重功能,可以保证同一个用户不会中奖两次。

key为抽奖活动名,value为员工名称,把所有员工名称放入抽奖箱 :

>SADD lucky Tom Jerry John Sean Marry Lindy Sary Mark
(integer) 5

如果允许重复中奖,可以使用 SRANDMEMBER 命令。

# 抽取 1 个一等奖:
> SRANDMEMBER lucky 1
1) "Tom"
# 抽取 2 个二等奖:
> SRANDMEMBER lucky 2
1) "Mark"
2) "Jerry"
# 抽取 3 个三等奖:
> SRANDMEMBER lucky 3
1) "Sary"
2) "Tom"
3) "Jerry"

如果不允许重复中奖,可以使用 SPOP 命令。

# 抽取一等奖1> SPOP lucky 1
1) "Sary"
# 抽取二等奖2> SPOP lucky 2
1) "Jerry"
2) "Mark"
# 抽取三等奖3> SPOP lucky 3
1) "John"
2) "Sean"
3) "Lindy"

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

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

相关文章

cgroups 实践

CPU 限制 1. 创建测试的 cgroup 在 /sys/fs/cgroup/cpu 下面创建自己的 cgroups 测试目录,该目录会自动创建一些文件,对进程或者线程的控制都可以通过修改这些文件内容自动完成。 tasks:被 cgroup 管理的进程 cpu.cfs_period_us&#xff1a…

多线程(九):JUC组件

在来时juc组件前,我们先把上一章遗漏的部分给补上。 synchronized 实现策略:锁升级: 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁 还有一个 : 锁消除 锁消除即删除不必要的加锁操作。JVM在运行时,对一些“…

C++内联函数详解

目录 如何定义内联函数? 内联函数的优势 内联函数的缺点 内联函数的使用场景 示例代码 总结 在C中,内联函数是一种特殊的函数,它的作用是在程序编译时将函数的代码直接嵌入到调用该函数的代码中,从而避免了函数调用的开销。这…

C语言 非本地跳转实现native层TryCatch

前言 最近研究native hook的技术,了解到了这个非本地跳转,本文就是介绍他,对于解决native crash非常有用。 非本地跳转介绍 C语言的本地跳转是指goto、break、continue等语句,但是这个语句最大局限就是只能实现函数内部的跳转。…

深度学习 - 40. N-Gram 采样与 Session 数据获取 For EGES

目录 一.引言 二.订单数据预处理 1.数据样例 2.订单数据处理 3.用户 Session 构建 三.构造 sku_id 游走序列 1.获取完整 Session List 2.统计 sku_id 转移词频 3.构建 sku_id 图 4.游走构造 sku 序列 四.商品侧信息预处理 1.读取商品信息 2.Left Join 匹配侧信息 …

三甲医院体检管理系统源码PEIS ,体检总检建议、体检套餐、各种模板

PEIS体检管理系统源码 本套PEIS医院体检管理系统源码,采用C#语言开发,C/S架构,前台开发工具为Vs2012,后台数据库采用oracle大型数据库。有演示。 文末获取联系 PEIS体检管理系统适用于大中型医院的独立体检中心、干部保健处、民营…

Java基础:编译时和运行时的区别

在java开发设计过程中,了解java运行时和编译时的区别非常有必要。 如下从几个问题来描述两者的区别 1、如下代码片段中,A行和B行的区别是什么 line A是在编译时计算值,line B是在运行时计算值。 当该类编译后,如果使用一些反编译…

ROS导航

参考文章: (31条消息) ROS导航小车1 teb_local_planner参数(仅作记录/收集)_teb local planner参数_Crush Mome的博客-CSDN博客 运行导航: 1. 启动底盘控制包 : base_conctronl 2.启动键盘控制节点: rosrun teleop_twist_ke…

ROG魔霸7Plus电脑一直蓝屏错误怎么重装系统?

ROG魔霸7Plus电脑一直蓝屏错误怎么重装系统?有用户在使用ROG魔霸7Plus电脑的时候,频繁的遇到了系统蓝屏的情况。因为这样影响了自己的正常使用,所以想要进行系统的重新安装。那么如何进行系统重装操作呢?来看看以下的操作方法教学…

ONES × 中国信通院《中国企业软件研发管理白皮书》即将发布 | 预约直播

由 ONES 与中国信息通信研究院联合发起的《中国企业软件研发管理白皮书》(下称「白皮书」)将于 4 月 20 日 正式发布。白皮书由 ONES、中国信息通信研究院云计算与大数据研究所、招商基金管理有限公司、紫金财产保险股份有限公司、深圳市鸿合创新信息技术…

AI大模型内卷加剧,商汤凭什么卷进来

2023年,国内大模型何其多。 目前,已宣布推出或即将推出大模型的国内企业多达20余家,基本上能想到的相关企业都已入局。其中,既有资金雄厚的BAT、华为、字节等大厂,也有王慧文、王小川、周伯文等互联网大佬领衔的初创企…

外卖小程序01

目录 nginx反向代理和负载均衡反向代理好处nginx反向代理的配置方式 负载均衡**nginx 负载均衡的配置方式:****nginx 负载均衡策略:** 动静分离 用户密码加密需求代码实现 Swagger框架介绍使用步骤常用注解使用案例:员工登录EmployeeController实体类Emp…

科研成果 | 不同调制方式的开源数据集及其数据扩增方式

文章目录 1. 数据源2. 数据扩增2.1 基于opencv的一些基础变换2.2 基于GAN网络的方法2.2.1 SinGAN2.2.2 基于多图的GAN方法1. 数据源 网址: https://www.sigidwiki.com/wiki/VHF 每种数据基本只有一条,所以要用的话只能进行数据扩征 2. 数据扩增 两种方法: 基于opencv的一…

浏览器输入 http 自动转 https 问题解决方法

目录 表象 原因 解决方案 解决方案一 解决方案二 表象 今天在开发的过程中遇到一个问题,我们项目的地址是 “http://xxx.xxx.com/website/” ,结果粘贴到浏览器里自动跳转成了 “https://xxx.xxx.com/website/”。百思不解啊,为啥呢。 …

git上如何通过本地仓库推送自己的代码到远程仓储

从gitHub或者gitee上拉取代码后,我老是想着把别人的代码保存到自己的仓库上,这里教你一招。 gitee的: 首先我们在gitee或者github上创建一个自己的仓库,github的我就不在展示了,基本上和gitee操作一样 输入相关信息…

【redis】bitmap、hyperloglog、GEO案例

【redis】bitmap、hyperloglog、GEO案例 文章目录 【redis】bitmap、hyperloglog、GEO案例前言一、面试题二、统计的类型聚合统计排序统计问题:思路 二值统计 0和1基数统计 三、hyperloglog1、名词理解UV 独立访客PV 页面浏览量DAU 日活跃用户MAU 月活跃度 2、看需求…

愚蠢的往事-网络安全专题之数字证书

血泪教训史,我被骗去办理了数字证书。 文章目录 加密算法摘要算法数字签名数字证书血泪开篇数字证书 加密算法 相关知识点:对称加密算法、非对称加密算法、信息完整性验证算法。 对称加密算法:1.加密密钥和解密密钥相同的算法,…

小行助学答题系统编程等级考试scratch三级真题2023年3月(含题库答题软件账号)

青少年编程等级考试scratch真题答题考试系统请点击 电子学会-全国青少年编程等级考试真题Scratch一级(2019年3月)在线答题_程序猿下山的博客-CSDN博客_小航答题助手 1.计算“248……128”,用变量n表示每项,根据变化规律&#xf…

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈

http客户端Feign &#xff08;一&#xff09;基于Feign远程调用 1、RestTemplate方式调用存在的问题 2、Feign的介绍 3、定义和使用Feign客户端 这个接口里面将来的封装的就是所有对userservice发起的远程调用 1、orderserivce的pom <!--feign客户端依赖--> <depe…

Dsq: 用于针对JSON、CSV、Excel、Parquet等运行SQL查询的命令行工具

目录 About Install macOS Homebrew macOS、Linux和WSL上的二进制文件 Windows上的二进制文件&#xff08;非WSL&#xff09; 从源代码生成和安装 Usage Pretty print dsq的管道数据 多个文件和连接 无需查询即可将数据转换为JSON 嵌套在对象中的对象数组 嵌套对象…