Redis - Set 集合

news2024/11/20 20:39:03

目录

前言

命令

SADD 将一个或者多个元素添加到 set 中

语法

SMEMBERS 获取一个 set 中的所有元素

语法

SISMEMBER 判断⼀个元素在不在 set 中

语法

SCARD 获取 set 中的元素个数

语法

SPOP 从 set 中随机删除并返回⼀个或者多个元素

语法

SMOME 将⼀个元素从源 set 取出并放入目标 set 中

语法

SREM 将指定的元素从 set 中删除

语法

SINTER 获取给定 set 的交集中的元素

语法

SINTERSTORE 获取给定 set 的交集中的元素并保存目标 set 中

语法

SUNION 获取给定 set 的并集中的元素

语法

SUNIONSTORE 获取给定 set 的并集中的元素并保存到目标 set 中

语法

SDIFF 获取给定 set 的差集中的元素

语法

SDIFFSTOR  获取给定 set 的差集中的元素并保存到目标 set 中

语法

内部编码

使用场景

一.存储标签

二.存储用户好友

三.统计 UV


前言

        集合类型可保存多个字符串类型的元素,但和列表类型不同的是,集合中的元素之间是⽆序的(顺序不重要,变换一下集合中的数据顺序,集合不会发生改变) 的并且元素不允许重复

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

命令

SADD 将一个或者多个元素添加到 set 中

注意,重复的元素⽆法添加到 set 中。

语法

SADD key member [member ...]

时间复杂度:O(1)  

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

        因为集合中不会存储相同的数据,所以会对插入的数据进行去重,插入 1 1 2 3,实际上插成功 1 2 3,3个数据

SMEMBERS 获取一个 set 中的所有元素

语法

SMEMBERS key

时间复杂度:O(N)

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

SISMEMBER 判断⼀个元素在不在 set 中

语法

SISMEMBER key member

时间复杂度:O(1)

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

SCARD 获取 set 中的元素个数

语法

SCARD key

时间复杂度:O(1) 

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

SPOP 从 set 中随机删除并返回⼀个或者多个元素

        pop 一般表示从末尾删除一个元素,但集合中的元素是无序的,所以并不清楚哪个元素在末尾,相当于随机删除一个或多个元素(在源码中对)

语法

SPOP key [count]

时间复杂度:O(N),n 是 count 

返回值:取出的元素。

SMOME 将⼀个元素从源 set 取出并放入目标 set 中

语法

SMOVE source destination member

时间复杂度:O(1)

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

SREM 将指定的元素从 set 中删除

        可以一次删除一个元素,也可以一次删除多个元素

语法

SREM key member [member ...]

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

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

SINTER 获取给定 set 的交集中的元素

语法

SINTER key [key ...]

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

返回值:交集的元素。

SINTERSTORE 获取给定 set 的交集中的元素并保存目标 set 中

语法

SINTERSTORE destination key [key ...]

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

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

SUNION 获取给定 set 的并集中的元素

语法

SUNION key [key ...]

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

返回值:并集的元素

SUNIONSTORE 获取给定 set 的并集中的元素并保存到目标 set 中

语法

SUNIONSTORE destination key [key ...]

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

返回值:并集的元素个数

SDIFF 获取给定 set 的差集中的元素

语法

SDIFF key [key ...]

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

返回值:差集的元素

SDIFFSTOR  获取给定 set 的差集中的元素并保存到目标 set 中

语法

SDIFFSTORE destination key [key ...]

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

返回值:差集的元素个数

内部编码

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

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

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

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

使用场景

一.存储标签

        集合类型⽐较典型的使⽤场景是标签(tag),例如 A ⽤户对娱乐、体育板块⽐较感兴趣,B ⽤户对历史、新闻⽐较感兴趣,这些兴趣点可以被抽象为标签。

        为什么集合适合存储标签呢?因为标签是不在乎顺序的,用户喜欢打篮球和旅游,这两个标签是不需要区分顺序的,这与集合的无效性相对应。一个用户相同的标签只用存储一份即可,比如用户喜欢打篮球,只需要存储一份喜欢打篮球的标签即可,不需要存多份,这与集合中的元素不允许重复相对应。

        而且由于集合可以很好的支持交并操作,所以可以很方便的分析两个用户之间的共同爱好,还可以知道用户更喜欢哪些方面,这些数据对于增强⽤户体验和⽤户黏度都⾮常有帮助。例如⼀个 电⼦商务⽹站会对不同标签的⽤户做不同的产品推荐。

二.存储用户好友

        存储用户好友,方便分析用户之间的共同好友(通过求交集)

三.统计 UV

        一个互联网产品怎么衡量用户量,用户规模?主要的指标是两方面:PV,UV

        PV:页面浏览量,每次访问服务器都会产生一个 PV

        UV:用户浏览量,每个用户访问服务器都会产生一个 UV ,但一个用户的多次访问不会使 UV 增加,所以要对用户的访问信息进行去重,同一个用户的访问信息只记录一次,这个去重的操作就可以由 set 实现

        

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

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

相关文章

电脑教程1

一、介绍几个桌面上面的软件 1、火绒:主要用于电脑的安全防护和广告拦截 1.1 广告拦截 1.打开火绒软件点击安全工具 点击弹窗拦截 点击截图拦截 拦截具体的小广告 2、向日葵远程控制:可以通过这个软件进行远程协助 可以自己去了解下 这个软件不要…

每日算法之两两交换链表中的节点

题目描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head [1,2,3,4] 输出&…

Apollo 7周年大会自动驾驶生态利剑出鞘

前言 4月22日,百度Apollo在北京车展前夕举办了以“破晓•拥抱智变时刻”为主题的智能汽车产品发布会,围绕汽车智能化,发布了智驾、智舱、智图等全新升级的“驾舱图”系列产品。 1、7周年大会 自2013年百度开始布局自动驾驶,201…

Kotlin基础​​

数据类型 定义变量 var表示定义变量,可以自动推导变量类型,所以Int可以不用写。 定义常量 条件语句 if表达式可以返回值,该值一般写在if里的最后一行 类似switch的用法 区间 循环 a是标签,可以直接break到标签的位置&#xf…

Docker 的数据管理 端口映射 容器互联 镜像创建

一 Docker 的数据管理 1 管理 Docker 容器中数据主要有两种方式: 数据卷(Data Volumes) 数据卷容器(DataVolumes Containers)。 1.1 数据卷 数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机…

【PLC学习十四】TIA.V18无法启动仿真的问题

【PLC学习十四】TIA.V18无法启动仿真的问题 文章目录 【PLC学习十四】TIA.V18无法启动仿真的问题前言一、程序仿真出现的问题二、解决方法1.无法仿真的问题2.因安全问题,无法编译的问题3、在TIA V18内部设置完成PG/PC接口后,下一次打开仍然不能仿真&…

【Vue3+Tres 三维开发】01-HelloWord

预览 什么是TRESJS 简单的说,就是基于THREEJS封装的能在vue3中使用的一个组件,可以像使用组件的方式去创建场景和模型。优势就是可以快速创建场景和要素的添加,并且能很明确知道创景中的要素构成和结构。 项目创建 npx create-vite@latest # 选择 vue typescript安装依赖…

【Linux 进程间通信】管道

文章目录 1.为什么操作系统需要向用户提供进程间通信方式?2.进程间通信的种类3.管道3.1管道的作用3.2管道的本质3.3管道的通信原理3.4管道的分类 1.为什么操作系统需要向用户提供进程间通信方式? ①🍎资源共享:有的时候两个进程需…

QT——简易计算器(从0开始)

目录 一、题目描述: 二、创建工程: 1. ​编辑 2. 3. 4. 默认 5. 6. 7. 8. 默认 9. 创建完成 三、UI界面设计: 1. 添加按钮 1. 2. 按钮界面 3. 按钮绑定快捷键 2. 文本框添加 1. 文本框字体 2. 默认文本 3. 文本对齐方式…

英智数字孪生机器人解决方案,赋能仓库物流模式全面升级

工业机械臂、仓储机器人、物流机器人等模式的机器人系统在现代产业中扮演着愈发重要的角色,他们的发展推动了自动化和智能化水平的提高,有助于为制造业、物流业、医疗保健业和服务业等行业创造新效率并提升人们的生活质量。 行业面临的挑战 机器人开发、…

为何要与云产商进行云端防护合作,上云企业如何保障云端安全

随着大数据、云计算等信息技术的迅猛发展,企业为了降低成本、提高效率,纷纷将业务迁移至云端。 随着大数据、云计算等信息技术的迅猛发展,企业为了降低成本、提高效率,纷纷将业务迁移至云端。这一全面的上云浪潮对传统的安全企业格…

YOLOv8+PyQt5野外火焰检测系统(可以从图像、视频和摄像头三种路径检测)

1.效果视频:https://www.bilibili.com/video/BV1Tm421s7te/?spm_id_from333.999.0.0 2.资源包含可视化的野外火焰检测系统,可用于火灾预警或火灾救援,该系统可自动检测和识别图片或视频当中出现的火焰,以及自动开启摄像头&#…

使用Windows GDI进行绘图

使用Windows GDI绘图,可以使用MFC,也可以直接使用Windows API绘图,两者其实都一样。MFC也是封装了Windows API。 下面以MFC为例,进行说明。因为MFC帮我们做好了一些底层,可以直接使用Windows GDI的函数。 在MFC中使用…

如此建立网络根文件系统 Mount NFS RootFS

安静NFS系统服务 sudo apt-get install nfs-kernel-server 创建目录 sudo mkdir /rootfsLee 将buildroot编译的根文件系统解压缩到 sudo tar xvf rootfs.tar -C /rootfsLee/ 添加文件NFS访问路径 sudo vi /etc/exports sudo /etc/exports文件,添加如下一行 …

SecureCRT中添加命令显示为空如何处理?(原因添加了空行)

相关背景信息 配置相关路径:~/Library/Application\ Support/VanDyke/SecureCRT/Config包括的配置信息 按钮、命令、全局配置、色彩、以及license都在$ ls ButtonBarV4.ini Commands Global.ini SSH2.ini Button…

STM32单片机通过ST-Link 烧录和调试

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. ST-LINK V2 2. 操作步骤 2.1 连接方式 2.2 驱动安装常规步骤 2.3 Keil中的设置 3. 调式仿真 4. 常见问题排查 1. ST-LINK V2 ST LINK v2下载器用于STM32单片机,可以下载程序、调试…

代码随想录第49天|121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 动态规划之 LeetCode:121.买卖股票的最佳时机1_哔哩哔哩_bilibili 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一…

为什么常用氢化物

知识星球(星球名:芯片制造与封测社区)里的学员问:diffusion工序,所需要的气体种类有哪些? Diffusion是什么工序? "Diffusion"工序是通过热能将掺杂剂原子扩散到硅片中,以形…

AD高速板设计--RJ45(笔记)

瑞芯微VS全志科技(处理器芯片王者) - 知乎 (zhihu.com) RTL8211E应用(二)之信号输入、输出接口_rtl8211eg中文资料-CSDN博客 Raspberry Pi 硬件 - Raspberry Pi 文档 RJ45接口的PCB设计布局布线注意事项 - 知乎 (zhihu.com) 以…

CTF之eval

首先我们先了解一下eval()函数 什么是eval()? eval() 函数把字符串按照 PHP 代码来计算。 该字符串必须是合法的 PHP 代码,且必须以分号结尾。 如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误…