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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ZYNQ学习】PL第一课

这节课讲什么? 这节课的名字本来是想写为LED,但这一课里除了LED也有按键,又想换为GPIO控制,但关于PL的GPIO控制,不应该这么草率和简单,而且这一课有很多和ZYNQ或者PL关联性不强的东西要说。 所以我写了删删…

基于AT89C52单片机的计算器设计与仿真

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/88637995?spm1001.2014.3001.5503 源码获取 B 源码仿真图课程设计51 摘 要 计算器一般是指“电子计算器”,能进行数学运算的手持机器,拥有集成电路芯…

UE4 去除重复纹理

如果直接连的话,效果如下: 就存在很多重复的纹理,如何解决这个问题呢? 将同一个纹理,用不同的Tilling,将Noise进行Lerp两者之间,为什么要这么做呢?因为用一个做清晰纹理,…

适用于 Windows 和 Mac 的 10 款最佳照片恢复软件(免费和付费)

丢失照片很容易。这里点击错误,那里贴错标签的 SD 卡,然后噗的一声,一切都消失了。值得庆幸的是,在技术领域,你可以纠正一些错误。其中包括删除数据或格式化错误的存储设备。 那么,让我们看看可用于从 SD …

人工智能与自动驾驶:智能出行时代的未来之路

一、前言 首先,我们先来说下什么是人工智能,人工智能(Artificial Intelligence,简称AI)是一门研究如何使计算机系统能够模拟、仿真人类智能的技术和科学领域。它涉及构建智能代理,使其能够感知环境、理解和…

Unity中URP下的菲涅尔效果实现(个性化修改)

文章目录 前言一、我们修正一下上篇文章中,可能遗留的Bug1、N向量 变为 单位向量2、使颜色范围在合理区间 二、实现菲涅尔效果强弱可自定义调节三、修改菲涅尔效果颜色1、在属性面板定义颜色属性2、在常量缓冲区申明该参数3、在片元着色器中,用颜色和菲涅…

【日积月累】Mysql性能优化

目录 【日积月累】Mysql性能优化 1.前言2.MySql性能优化的主要方面2.1硬件和操作系统成面优化2.2架构设计层优化(表结构)2.3程序配置优化2.5表结构及索引优化2.4sql执行优化 3.总结4.参考 文章所属专区 积月累 1.前言 MySQL是一种常用的开源关系型数据…

【PHP入门】1.1-PHP初步语法

-PHP语法初步- PHP是一种运行在服务器端的脚本语言&#xff0c;可以嵌入到HTML中。 1.1.1PHP代码标记 在PHP历史发展中&#xff0c;可以使用多种标记来区分PHP脚本 ASP标记&#xff1a; <% php代码 %>短标记&#xff1a; <? Php代码 ?>&#xff0c;以上两种…

【TB作品】51单片机 实物+仿真-电子拔河游戏_亚博 BST-M51

代码工程。 http://dt4.8tupian.net/2/28880a66b12880.pg3这段代码是用于一个数字拔河游戏的嵌入式系统&#xff0c;采用了基于8051架构的单片机&#xff0c;使用Keil C51编译器。 主要功能包括&#xff1a; 数码管显示&#xff1a;使用了四个数码管&#xff08;通过P2的控制…

从零开始在Linux服务器配置并运行YOLO8+Web项目

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 神经网络&#xff08;随缘更新&#xff09; ✨特色…

js基础入门

先来一点js基础&#xff0c;其实js大部分的时候都在处理对象或者数组。 对象四个基本操作&#xff1a;增删改查 掌握元素的增删改查&#xff0c;了解如何拷贝&#xff0c;深拷贝和浅拷贝的区别。详情见代码 <script>//创建对象一共有三种赋值声明的语法let obj{} //赋值…

Ps:动作 - 基础篇

Ps 中的动作 Action可以让你自动、连续地完成多个操作&#xff0c;包括基础的调色、复杂的合成等。对于经常要执行的任务&#xff0c;使用动作&#xff0c;可大大提高工作效率。 Ps菜单&#xff1a;窗口/动作 Window/Action 快捷键&#xff1a;Alt F9 ◆ ◆ ◆ 认识动作面板…

如何用Python向图像中加入噪声

我们在做机器视觉项目的过程中&#xff0c;有的时候需要向图像中加入噪声。Pytorch本身不支持类似的功能&#xff0c;如果自己写的话&#xff0c;不但麻烦&#xff0c;而且容易出错。好在skimage支持这个功能。代码如下&#xff1a; import skimage import matplotlib.pyplot …

web之CSS悬停效果页面设计

参考小米商城的“手机”页面&#xff0c;做出一个“手机”的标签&#xff0c;实现当鼠标悬停在“手机”上时&#xff0c;出现手机系列菜单&#xff1b;当鼠标移走时&#xff0c;菜单页面消失的效果&#xff01; 参考图&#xff1a; 实现代码&#xff1a; <!DOCTYPE html&g…

机器学习笔记 - 时间序列分析基础概念解释

一、简述 时间序列分析是一种统计方法,可检查定期收集的数据点以揭示潜在的模式。该技术与各个行业高度相关,因为它可以根据历史数据做出决策和预测。通过了解过去并预测未来,时间序列分析在金融、医疗保健、能源、供应链管理、天气预报、营销等领域发挥着至关重要的作用。 …

How to helm install prometheus 【 helm 安装 prometheus 】

文章目录 1. 简介2. 简单部署3. 数据持久化部署3.1 设置必要的环境变量3.2 运行安装脚本3.3 查看 1. 简介 kube-prometheus-stack是一个基于Prometheus和Grafana的开源软件套件&#xff0c;用于在Kubernetes集群中进行监控和可视化。它提供了一套完整的工具和组件&#xff0c;…

神经网络学习小记录76——Tensorflow2设置随机种子Seed来保证训练结果唯一

神经网络学习小记录76——Tensorflow2设置随机种子Seed来保证训练结果唯一 学习前言为什么每次训练结果不同什么是随机种子训练中设置随机种子 学习前言 好多同学每次训练结果不同&#xff0c;最大的指标可能会差到3-4%这样&#xff0c;这是因为随机种子没有设定导致的&#x…

ArcMap自定义脚本工具箱迁移至ArcGIS pro

本文记录了将ArcMap10.7创建的自定义脚本工具箱&#xff08;.tbx&#xff09;迁移至ArcGIS pro的过程 ArcGIS Pro使用的是python版本与ArcMap不同&#xff0c;前者为python3&#xff0c;后者为python2。由于python3 和 python2 的部分语法不兼容&#xff0c;以及一些地理处理工…

Redis设计与实现之事务

一、事务 Redis 通过 MULTI 、DISCARD 、EXEC 和 WATCH 四个命令来实现事务功能&#xff0c;本章首先讨 论使用 MULTI 、DISCARD 和 EXEC 三个命令实现的一般事务&#xff0c;然后再来讨论带有 WATCH 的事务的实现。 因为事务的安全性也非常重要&#xff0c;所以本章最后通过…

季节性ARIMA模型进行时间序列预测

首先对于模型&#xff1a; SARIMA(p,d,q)x(P,D,Q)。 参数的选择的注意事项如下&#xff1a; where, P, D and Q are SAR, order of seasonal differencing and SMA terms respectively and ‘x’ is the frequency of the time series. If the model has well defined season…