【Redis】set常用命令集合间操作内部编码使用场景

文章目录

  • 前置知识
  • 常见命令
    • SADD
    • SMEMBERS
    • SISMEMBER
    • SCARD
    • SPOP
    • SMOVE
    • SREM
  • 集合间操作
    • SINTER
    • SINTERSTORE
    • SUNION
    • SUNIONSTORE
    • SDIFF
    • SDIFFSTORE
  • 命令小结
  • 内部编码
    • 测试内部编码
  • 使用场景

前置知识

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

  • 集合当中的元素之间是⽆序的
  • 集合当中的元素之间不可以重复
  • ⼀个集合中最多可以存储232 - 1个元素
  • Redis除了⽀持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集

image-20231021211309580


常见命令

SADD

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

语法:SADD key member [member ...]

返回值:本次添加成功的元素个数 时间复杂度:O(1)

image-20231023201705882

SMEMBERS

获取⼀个set中的所有元素,注意,元素间的顺序是⽆序的

语法:SMEMBERS key 

返回值:所有元素的列表 时间复杂度:O(N)

image-20231023201757532

SISMEMBER

判断⼀个元素在不在set中

语法:SISMEMBER key member 

返回值:1表⽰元素在set中。0表⽰元素不在set中或者key不存在 时间复杂度:O(1)

image-20231023201816936

SCARD

获取⼀个set的基数(cardinality),即set中的元素个数

语法:SCARD key

返回值:set内的元素个数 时间复杂度:O(1)

image-20231023202316604

SPOP

从set中删除并返回⼀个或者多个元素。注意,由于set内的元素是⽆序的,所以删除哪个元素实际是未定义⾏为,即可以看作随机的

语法:SPOP key [count] #count:要删除的元素个数,随机删除

返回值:取出的元素 时间复杂度:O(N),n是count

image-20231023202555667


SMOVE

将member从source上删除,再插入到destination当中

语法:SMOVE source destination member 

返回值:1表⽰移动成功,0表⽰失败 时间复杂度:O(1)

image-20231023202733740

注意:如果要移动的元素不再source当中,那么此时返回0,表示移动失败


SREM

将指定的元素从set中删除,额可以一次删除一个/多个

语法:SREM key member [member ...] 

返回值:本次操作删除成功的元素个数 时间复杂度:O(N),N是要删除的元素个数

image-20231023202829255

集合间操作

交集、并集、差集的概念

image-20231021211910811

交集:最终结果同时出现在两个集合当中的元素

A:1 2 3 4 		B:3 4 5  6  			A和B的交集为:3 4

并集:将多个集合当中的数据集中放在一起,如果元素有重复,最终只保留一份

A:1 2 3 4 		B:3 4 5  6  A和B的并集为:1 2 3 4 5 6

差集:A和B做差集,就是找出在A集合当中存在,在B集合当中不存在的元素

A:1 2 3 4 		B:3 4 5  6  A和B的差集为:1 2  B和A的差集:5 6

SINTER

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

语法:SINTER key [key ...]  #此处的每个key对应一个集合

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

image-20231023202918269

注意:1个或者多个set取交集


SINTERSTORE

获取给定set的交集中的元素并保存到⽬标set中

语法:SINTERSTORE destination key [key ...]

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

image-20231023203031685

SUNION

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

语法:SUNION key [key ...] 

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

image-20231023203107567

SUNIONSTORE

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

语法:SUNIONSTORE destination key [key ...] 

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

image-20231023203134053

SDIFF

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

语法:SDIFF key [key ...] 

返回值:差集的结果 时间复杂度:O(N),N给定的所有集合的总的元素个数

注意:返回的结果是第一个集合中存在而第二个集合(后面集合)中不存在的元素,所以key的顺序很重要

image-20231023203614536

SDIFFSTORE

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

语法:SDIFFSTORE destination key [key ...]

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

image-20231023203700856


命令小结

image-20231021212405975


内部编码

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

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

测试内部编码

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

image-20231021212708820

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

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

image-20231021212739170


使用场景

1.集合类型⽐较典型的使⽤场景是标签

例如A⽤⼾对娱乐、体育板块⽐较感兴趣,B⽤⼾对历史、新闻⽐较感兴趣,这些兴趣点可以被抽象为标签。有了这些数据就可以得到喜欢同⼀个标签的⼈,以及⽤⼾的共同喜好的标签,这些数据对于增强⽤⼾体验和⽤⼾黏度都⾮常有帮助

  • 例如⼀个电⼦商务⽹站会对不同标签的⽤⼾做不同的产品推荐

2.计算用户之间的共同好友 => 集合当中求交集

3.使用set统计UV进行去重

一个互联网产品如何衡量用户量和用户规模

1.PV-page view:用户每次访问该服务器,每次访问都会产生一个PV

2.UV-user view:每个哟关乎访问服务器都会产生一个uv,但是同一个用户多次访问,不会使uv增加,uv需要按照用户进行去重

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

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

相关文章

11.8旧有报错与修改

我将uart_done(出问题的信号)的变量类型设为reg了,也就是我是reg uart_done这个信号的,这样做是错误的,哪怕你在接收模块确实定义的是reg类型,但是在顶层模块的时候,它可以视为是一条单纯的线而…

首次分享一波

本人对单片机等电子领域感兴趣,已发布33篇文章,愿与读者们互赞互关❤️💕💞💗💓💖 日月同辉,与我共生_单片机基础,单片机串口通信-CSDN博客

基于显著性的无人机多光谱图像语义杂草检测与分类

Saliency-Based Semantic Weeds Detection and Classification Using UAV Multispectral Imaging(2023) 摘要1、介绍2、相关工作2.1 监督学习2.2 半监督学习2.3 无监督学习 3、方法3.1 贡献3.2 PC/BC-DIM NEURAL NETWORK(预测编码/有偏竞争-分裂输入调制…

[ACTF2020 新生赛]Upload 1

题目环境: 仍旧是文件上传漏洞 这道题和上一道大差不差、大同小异、这里不再赘述。 [极客大挑战 2019]Upload 1:https://blog.csdn.net/m0_73734159/article/details/134267317?spm1001.2014.3001.5501 区别在于本题需要在抓包数据里面改文件后缀&#…

Web Worker:JS多线程的伪解药?

前言 在前端开发领域,JavaScript 的单线程限制一直是一个难以忽视的挑战。当谈到解决JavaScript的单线程限制时,HTML5引入的Web Worker被普遍认为是一剂解药💊。同时,业界中大量的文章也是聚焦于讨论web worker的神奇力量。然而&…

【JavaEE】实现简单博客系统-前端部分

文件目录&#xff1a; 展示&#xff1a; blog_list.html: <!DOCTYPE html> <html lang"cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><t…

制作甘特图

教程秒懂百科​​​​​​

电路布线问题动态规划详解(做题思路)

对于电路布线问题&#xff0c;想必学过动态规划的大家都很清除。今天就来讲解一下这个动态规划经典题目。 目录 问题描述输入分析最优子结构代码 问题描述 在一块电路板的上、下2端分别有n个接线柱。根据电路设计&#xff0c;要求用导 线(i,π(i))将上端接线柱与下端接线柱相…

RFSoC Debug:Petalinux 不显示 flash选项

这个板子和NI的X410是一样的。 问题 不显示Flash选项 [*] Advanced bootable images storage Settings ---> boot image settings ---> Image storage media (primary flash) --->解决 在Block Design中添加SD卡或者Flash选项&#xff0c;否则就不会显示&#xff1…

Linux驱动开发——USB设备驱动

目录 一、 USB 协议简介 二、 Linux USB 驱动 三、 USB 设备驱动实例 一、 USB 协议简介 USB(Universal Serial Bus&#xff0c;通用串行总线)正如它的名字一样&#xff0c;是用来连接PC外设的一种通用串行总线&#xff0c;即插即用和易扩展是它最大的特点。所谓即插即用&am…

软件测试怎么测别的类的main方法

软件测试怎么测别的类的main方法 🍎如果软测开发者题目待测类里有main方法,我们如何测? 可以采取以下步骤: 了解main函数的功能:首先,你需要了解这个main函数的功能和预期的输出。这样你才能设计出合适的测试用例。设计测试用例:设计测试用例时,需要考虑各种可能的输…

人工智能(AI)是一种快速发展的技术,其未来发展前景非常广阔。

人工智能&#xff08;AI&#xff09;是一种快速发展的技术&#xff0c;其未来发展前景非常广阔。以下是一些关于AI未来的可能发展方向和就业前景的详细说明&#xff1a; 1.机器学习工程师&#xff1a;机器学习是AI的核心技术之一&#xff0c;它涉及到从数据中自动学习模式并进…

一台电脑生成两个ssh,绑定两个GitHub账号

背景 一般一台电脑账号生成一个ssh绑定一个GitHub&#xff0c;即一一对应的关系&#xff01;我之前有一个账号也配置了ssh&#xff0c;但是我想经营两个GitHub账号&#xff0c;当我用https url clone新账号的仓库时&#xff0c;直接超时。所以想起了配置ssh。于是有了今天这篇…

一天吃透MySQL面试八股文

目录 事务的四大特性&#xff1f;数据库的三大范式事务隔离级别有哪些&#xff1f;生产环境数据库一般用的什么隔离级别呢&#xff1f;编码和字符集的关系utf8和utf8mb4的区别什么是索引&#xff1f;索引的优缺点&#xff1f;索引的作用&#xff1f;什么情况下需要建索引&…

【Linux】第十站:git和gdb的基本使用

文章目录 一、git的基本操作1.gitee新建仓库注意事项2.git的安装3.git的克隆4.git的add5.git的commit6.git的push7.git log8.git status9. .gitignore 二、Linux调试器---gdb1.背景2.gdb安装、进入与退出3.list/l4.r/run运行程序5. break/b 打断点6.info/i b 查看断点7.delete/…

2023年11月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年11月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…

csdn初始模板【自用】

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

【MongoDB-Redis-MySQL-Elasticsearch-Kibana-RabbitMQ-MinIO】Java全栈开发软件一网打尽

“Java全栈开发一网打尽&#xff1a;在Windows环境下探索技术世界的奇妙之旅” 前言 全栈开发是一项复杂而令人兴奋的任务&#xff0c;涵盖了从前端到后端、数据库到可视化层、消息队列到文件存储的广泛领域。本文将带您深入探讨在Windows环境下进行全栈开发的过程&#xff0…

金融帝国实验室(Capitalism Lab)推出一个密钥即完成注册机制!

为了方便趸购『金融帝国实验室』&#xff08;Capitalism Lab&#xff09;正版玩家&#xff0c;Enlight官方正式推出『一个密钥即完成注册』机制&#xff0c;切实简化游戏账户注册流程&#xff01; ————————————— 『一个密钥即完成注册』适用于趸购“游戏本体4DLC”…

LazyVim: 将 Neovim 升级为完整 IDE | 开源日报 No.67

curl/curl Stars: 31.5k License: NOASSERTION Curl 是一个命令行工具&#xff0c;用于通过 URL 语法传输数据。 核心优势和关键特点包括&#xff1a; 可在命令行中方便地进行数据传输支持多种协议 (HTTP、FTP 等)提供丰富的选项和参数来满足不同需求 kubernetes/ingress-n…