Redis Set类型

集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中

1)元素之间是无序的

2)元素不允许重复

一个集合中最多可以存储2的32次方个元素。Redis 除了支持集合内的增删查改操作,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多问题。

集合类型

在这里插入图片描述

Set命令

sadd

将一个或者多个元素添加到set中。注意,重复的元素无法添加到set中

语法

SADD key member [member ...]

时间复杂度:O(1)

返回值:本次添加成功的元素个数。

示例

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"

smembers

获取一个set中的所有元素,注意,元素间的顺序是无序的。

语法

SMEMBERS key

时间复杂度:O(N)

返回值:所有元素的列表。

示例

redis> sadd myset "Hello"
(integer) 1
redis> sadd myset "World"
(integer) 1
redis> smembers myset
1) "Hello"
2) "World"

sismember

判断一个元素在不在set中。

语法

SISMEMBER key member

时间复杂度:O(1)

返回值:1表示元素在set 中。0表示元素不在set中或者key不存在。

示例

redis> sadd myset "one"
(integer) 1
redis> sismember myset "one"
(integer) 1
redis> sismember myset "two"
(integer) 0

spop

从set中随机删除并返回一个或者多个元素。注意,由于set内的元素是无序的,所以取出哪个元素实际是未定义行为,即随机的。

语法

SPOP key [count]

时间复杂度:O(N), n是count,表示删除的元素个数

返回值:取出的元素。

示例

redis> sadd myset "one"
(integer) 1
redis> sadd myset "two"
(integer) 1
redis> sadd myset "three"
(integer) 1
redis> spop myset
"one"
redis> smembers myset
1) "three"
2) "two"
redis> sadd myset "four"
(integer) 1
redis> sadd myset "five"
(integer) 1
redis> spop myset 3    #删除三个数
1) "three"
2) "four"
3) "two"
redis> smembers myset
1) "five"

srandmember

用于从集合中随机返回一个元素。该命令提供了一个可选参数count,用于指定返回的元素数量。当count值为正数时,返回的元素不重复;当count值为负数时,返回的元素可以重复。

语法

SRANDMEMBER key [count]
  • key:要从中随机获取元素的集合的键。
  • count(可选):要返回的元素数量。

示例

127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> srandmember key
"4"
127.0.0.1:6379> srandmember key
"3"
127.0.0.1:6379> srandmember key
"1"
127.0.0.1:6379> srandmember key
"4"
127.0.0.1:6379> srandmember key 3
1) "3"
2) "2"
3) "1"

smove

smove用于将元素从一个集合移动到另一个集合。如果元素被成功移动,命令返回1,否则返回0。

语法

SMOVE source destination member
  • source:源集合的键。
  • destination:目标集合的键。
  • member:要移动的元素。

时间复杂度:O(1)

返回值:1表示移动成功,0表示失败。

示例

redis> sadd myset "one"
(integer) 1
redis> sadd myset "two"
(integer) 1
redis> sadd myotherset "three"
(integer) 1
redis> smove myset myotherset "two"
(integer) 1
redis> smembers myset
1) "one"
redis> smembers myotherset
1) "three"
2) "two"

srem

SREM用于从集合中删除一个或多个元素。此命令会返回成功删除元素的数量。

语法:

SREM key member [member ...]
  • key:集合的键名。
  • member:要删除的一个或多个元素。

时间复杂度:O(N),N是要删除的元素个数

返回值:本次操作删除的元素个数。

示例

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) "three"
2) "two"

scard

SCARD用于获取集合(Set)的成员数。

语法

SCARD key

时间复杂度:O(1)

返回值:set内的元素个数。

示例

redis> sadd myset "Hello"
(integer) 1
redis> sadd myset "World"
(integer) 1
redis> scard myset
(integer) 2

集合间操作

集合求交集、并集、差集

在这里插入图片描述

sinter/sinterstore

sinter

SINTER用于计算多个集合的交集。这个命令返回所有给定集合的交集。如果其中一个集合为零元素集合,结果也将是零元素集合。如果没有给定任何集合,结果是一个空集。

语法:

SINTER key [key ...]
  • key:一个或多个集合的键。

时间复杂度:O(N *M),N是最小的集合元素个数.M是最大的集合元素个数.

返回值:交集的元素。

示例

redis> sadd key1 "a" "b" "c"
(integer) 3
redis> sadd key2 "c" "d" "e"
(integer) 3
redis> sinter key1 key2
1) "c"

sinterstore

SINTERSTORE用于计算多个集合的交集,并将结果存储在新的集合中。如果目标集合已存在,那么这个集合将被覆盖。执行完命令后,返回结果集中的元素数量。

语法

SINTERSTORE destination key [key ...]
  • destination:新集合的键,用于存储计算出的交集。
  • key:一个或多个集合的键。

时间复杂度:O(N *M),N是最小的集合元素个数.M是最大的集合元素个数.

返回值:交集的元素个数。

示例

redis> sadd key1 "a" "b" "c"
(integer) 3
redis> sadd key2 "c" "d" "e"
(integer) 3
redis> sinterstore key key1 key2
(integer) 1
redis> smembers key   #存储到了新的key中
1) "c"

sunion/sunionstore

sunion

SUNION用于计算多个集合的并集。这个命令返回一个包含所有给定集合的并集的新集合。如果没有给定任何集合,结果是一个空集。

语法

SUNION key [key ...]
  • key:一个或多个集合的键。

时间复杂度:O(N),N给定的所有集合的总的元素个数.

返回值:并集的元素。

示例

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

sunionstore

SUNIONSTORE用于计算多个集合的并集,并将结果存储在新的集合中。如果目标集合已存在,那么这个集合将被覆盖。执行完命令后,返回结果集中的元素数量。

语法

SUNIONSTORE destination key [key ...]
  • destination:新的集合名。如果它已经存在,会被覆盖。
  • key [key ...]:一个或多个要求并集的集合。

时间复杂度:O(N),N给定的所有集合的总的元素个数.

返回值:并集的元素个数。

示例

redis> sadd key1 "a" "b" "c"
(integer) 3
redis> sadd key2 "c" "d" "e"
(integer) 3
redis> sunionstore key key1 key2
(integer) 5
redis> smembers key
1) "a"
2) "c"
3) "e"
4) "b"
5) "d"

sdiff/sdiffstore

sdiff

SDIFF 用于返回名为 key 的第一个集合与其他集合之间的差集。换句话说,结果集中的每个元素都是第一个集合中存在,而在其他集合中不存在的元素。

语法

SDIFF key [key ...]
  • key 是想要从中获取差集的集合的键。
  • [key...]是想要与第一个集合进行差集操作的其他集合的键。方括号表示这些键是可选的,可以有一个或多个。

时间复杂度:O(N),N给定的所有集合的总的元素个数.

返回值:差集的元素。

示例

redis> sadd key1 "a" "b" "c"
(integer) 3
redis> sadd key2 "c" "d" "e"
(integer) 3
redis> sdiff key1 key2
1) "a"
2) "b"
redis> sdiff key2 key1
1) "d"
2) "e"

sdiffstore

SDIFFSTORE 它的功能类似于 SDIFF,但是它不仅会返回差集,还会将差集保存到一个指定的 key 中。

语法

SDIFFSTORE destination key [key ...]
  • destination 是存储差集结果的新 key。

  • key 是想要从中获取差集的集合的键。

  • [key...]是想要与第一个集合进行差集操作的其他集合的键。方括号表示这些键是可选的,可以有一个或多个。

时间复杂度:O(N),N给定的所有集合的总的元素个数.

返回值:差集的元素个数。

示例

redis> sadd key1 "a" "b" "c"
(integer) 3
redis> sadd key2 "c" "d" "e"
(integer) 3
redis> sdiffstore key key1 key2
(integer) 2
redis> smembers key
1) "a"
2) "b"
redis> sdiffstore key key2 key1
(integer) 2
redis> smembers key
1) "d"
2) "e"

内部编码

集合类型的内部编码有两种:

  • intset(整数集合):当集合中的元素都是整数并且元素的个数小于set-max-intset-entries配置(默认512个)时,Redis 会选用intset 来作为集合的内部实现,从而减少内存的使用。
  • hashtable(哈希表):当集合类型无法满足intset 的条件时,Redis 会使用hashtable作为集合的内部实现。

1)当元素个数较少并且都为整数时,内部编码为 intset:

127.0.0.1:6379> sadd setkey 1 2 3 4
(integer) 4
127.0.0.1:6379> object encoding setkey
"intset"

2)当元素个数超过 512 个,内部编码为 hashtable:

127.0.0.1:6379> sadd setkey 1 2 3 4
(integer) 513
127.0.0.1:6379> object encoding setkey
"hashtable"

3)当存在元素不是整数时,内部编码为 hashtable:

127.0.0.1:6379> sadd setkey a
(integer) 1
127.0.0.1:6379> object encoding setkey
"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

2)给标签添加用户

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

3)删除用户下的标签

srem user:1:tags tag1 tag5
...

4)删除标签下的用户

srem tag1:users user:1
srem tag5:users user:1
...

5)计算用户的共同兴趣标签

sinter user:1:tags user:2:tags

同喜好的标签,这些数据对于增强用户体验和用户黏度都非常有帮助。例如一个电子商务网站会对不同标签的用户做不同的产品推荐。

1)给用户添加标签

sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag2 tag3 tag5
...
sadd user:k:tags tag1 tag2 tag4

2)给标签添加用户

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

3)删除用户下的标签

srem user:1:tags tag1 tag5
...

4)删除标签下的用户

srem tag1:users user:1
srem tag5:users user:1
...

5)计算用户的共同兴趣标签

sinter user:1:tags user:2:tags

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

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

相关文章

Axure元件的介绍使用以及登录界面

一、Axure元件介绍 简介: Axure元件是一种功能强大的设计工具,专门用于用户体验设计和交互设计。它可以帮助设计师创建可交互的原型,并实现各种界面元素的设计和布局。 Axure元件的基本特点包括: 多样性:Axure元件包括…

自动驾驶学习笔记(二十)——Planning算法

#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 参考线平滑 双层状态机 EM Planner …

找到一些看似冷门但流量惊人的一些网站!- 独立产品灵感周刊 DecoHack #057

本周刊记录有趣好玩的独立产品设计开发相关内容,每周发布,往期内容同样精彩,感兴趣的伙伴可以 点击订阅我的周刊。为保证每期都能收到,建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。 💻 产品推荐 1. Drawing Pics…

【Filament】绘制三角形

1 前言 Filament环境搭建中介绍了 Filament 的 Windows 和 Android 环境搭,本文将使用 Filament 绘制纯色和彩色三角形。 1.1 Filament 类图 1.2 图元 Filament 中图形的绘制都是基于三角形实现,三角形是构成复杂图形的最小基本单元。Filament 中输入模…

springMVC-模型数据的处理

一、数据放入到request域当中 1、把获取的数据放入request域中&#xff0c; 方便在跳转页面去显示 <a>添加主人信息</a> <form action"vote/vote04" method"post" >主人id&#xff1a;<input type"text" name"id&q…

JS中的模板字符串(ES6中的模板字面量语法),什么是模板字符串、怎么使用,附代码演示

模板字符串 1、JavaScript 在 ES6 新增了模板字符串语法。模板字符串可以作为普通字符串使用&#xff0c;其作用是可以在字符串中换行&#xff08;也就是支持多行字符串&#xff09;以及将变量和表达式插入字符串。 2、整个语法&#xff1a;使用反引号 &#xff0c;而不是单引…

MindOpt工具是如何做到配套使用的?请看此篇

Mindopt 介绍 MindOpt是阿里巴巴达摩院决策职能实验室研发的专注于优化领域&#xff0c;提供智能优化解决方案的品牌。主要的目标是帮助客户通过先进的优化算法和技术&#xff0c;实现业务流程的最佳化&#xff0c;提升效率&#xff0c;降低成本&#xff0c;并最大化业务价值。…

【强化学习-读书笔记】表格型问题的 Model-Free 方法

参考 Reinforcement Learning, Second Edition An Introduction By Richard S. Sutton and Andrew G. Barto无模型方法 在前面的文章中&#xff0c;我们介绍的是有模型方法&#xff08;Model-Based&#xff09;。在强化学习中&#xff0c;"Model"可以理解为算法…

助力智能人群检测计数,基于YOLOv3开发构建通用场景下人群检测计数识别系统

在一些人流量比较大的场合&#xff0c;或者是一些特殊时刻、时段、节假日等特殊时期下&#xff0c;密切关注当前系统所承载的人流量是十分必要的&#xff0c;对于超出系统负荷容量的情况做到及时预警对于管理团队来说是保障人员安全的重要手段&#xff0c;本文的主要目的是想要…

YOLOv3-YOLOv8的一些总结

0 写在前面 这个文档主要总结YOLO系列的创新点&#xff0c;以YOLOv3为baseline。参考(抄)了不少博客&#xff0c;就自己看看吧。有些模型的trick不感兴趣就没写进来&#xff0c;核心的都写了。 YOLO系列的网络都由四个部分组成&#xff1a;Input、Backbone、Neck、Prediction…

Spring之容器:IOC(2)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Nat. Methods | RoseTTAFoldNA准确预测蛋白质-核酸复合体

今天为大家介绍的是来自Frank DiMaio团队的一篇论文。蛋白质-核糖核酸&#xff08;RNA&#xff09;和蛋白质-脱氧核糖核酸&#xff08;DNA&#xff09;复合体在生物学中扮演着至关重要的角色。尽管近年来在蛋白质结构预测方面取得了显著进展&#xff0c;但预测没有同源已知复合…

海洋可视化大屏,Photoshop源文件

数据大屏通过实时的数据展示&#xff0c;可及时发现数据的变化和异常&#xff0c;以便及时采取措施。现分享海洋动力大数据监控、海洋数据监控系统、科技感海洋监控系统大屏模版的UI源文件&#xff0c;供UI设计师们快速获取PSD源文件完成工作 若需更多 大屏组件&#xff0c;请…

为什么MCU在ADC采样时IO口有毛刺?

大家在使用MCU内部ADC进行信号采样一个静态电压时&#xff0c;可能在IO口上看到这样的波形。这个时候大家一般会认识是信号源有问题&#xff0c;但仔细观察会发现这个毛刺的频率是和ADC触发频率一样的。 那么为什么MCU在ADC采样时IO口会出现毛刺呢&#xff1f;这个毛刺对结果有…

AI分布式训练:DDP (数据并行)技术详解与实战

编者按&#xff1a; 如今传统的单机单卡模式已经无法满足超大模型进行训练的要求&#xff0c;如何更好地、更轻松地利用多个 GPU 资源进行模型训练成为了人工智能领域的热门话题。 我们今天为大家带来的这篇文章详细介绍了一种名为 DDP(Distributed Data Parallel)的并行训练技…

基于Tkinter和OpenCV的目标检测程序源码+权重文件,实现摄像头和视频文件的实时目标检测采用YOLOv8模型进行目标检测

基于Tkinter和OpenCV的目标检测程序源码权重文件&#xff0c;实现摄像头和视频文件的实时目标检测采用YOLOv8模型进行目标检测 项目描述 本项目是一个基于Tkinter和OpenCV的目标检测应用程序&#xff0c;实现了摄像头和视频文件的实时目标检测。通过YOLOv8模型进行目标检测&a…

vue3 使用 element-plus 侧边菜单栏多开收起时 出现 迟滞、卡顿的问题

遇到问题 vue3 使用 element-plus 侧边菜单栏多开收起时 出现 迟滞、卡顿的问题 这里多开二级&#xff0c;当点击上面的回收时&#xff0c;出现了卡顿现象&#xff0c;找了很久才发现是因为引入了icon图标 具体原因不详&#xff01;&#xff01;&#xff01;&#xff01;坑啊 …

神经精神与遗传湘江论坛在湘召开,院士、专家共谋精神医学发展

12月15-17日&#xff0c;由中国遗传学会行为遗传学分会、湖南省遗传学会、湖南省神经科学学会和儿科罕见病教育部重点实验室共同主办的“神经精神与遗传湘江论坛”在湖南长沙召开&#xff0c;400余名参会代表齐聚一堂&#xff0c;为推动世界神经精神科学理念交融和前沿精神医学…

Windows C++ VS2022 OpenVINO 实例分割 Demo

目录 效果 模型信息 项目 代码 下载 其他 Windows C VS2022 OpenVINO 实例分割 Demo 效果 模型信息 Model Properties ------------------------- date&#xff1a;2023-09-07T17:11:46.798385 description&#xff1a;Ultralytics YOLOv8n-seg model trained on coco.…

为开发者设计的幻灯片演示工具Slidev

什么是 Slidev &#xff1f; Slidev 是专为程序员打造的演示文稿工具。该项目是基于 Web 的幻灯片制作和演示工具&#xff0c;让用户可以使用 纯文本 Markdown 语法制作幻灯片&#xff0c;支持导出为 PDF 或 PNG 格式的文件&#xff0c;或以单页面展示幻灯片。对于大多数不擅长…