Redis中的set类型

set的含义

  1. 集合
  2. 设置(和get相对应)

集合就是把一些有关联的数据放到一起

  1. 集合中的元素是无序的(和list的有序是对应的-顺序很重要,这里的无序就是顺序不重要);在list中[]1,2,3],[1,3,2],是两个不同的list,如果是集合就是同一个集合
  2. 集合中的元素是不能重复的(唯一的)

和list类似,集合中的每个元素也都是string类型(可以使用json这样的格式让string也能存储结构化数据)

set的常见命令

sadd

  • 将⼀个或者多个元素添加到 set 中。注意,重复的元素⽆法添加到 set 中
  • 时间复杂度:O(1) 返回值:本次添加成功的元素个数
  • 把集合中的元素称为member,就像hash类型中叫做field类似
  • 不能重复,看返回值即可

smembers

  • 获取⼀个 set 中的所有元素,注意,元素间的顺序是⽆序的。
  • 时间复杂度:O(N) 返回值:所有元素的列表。

sismember

  • 集合的操作都是带有S前缀的,判断⼀个元素在不在 set 中。
  • 时间复杂度:O(1) 返回值:1 表⽰元素在 set 中。0 表⽰元素不在 set 中或者 key 不存在。

spop

  • 从 set 中删除并返回⼀个或者多个元素,本来删除末尾,但是无法辨认,使用spop删除元素,所以随即删除
  • 注意,由于 set 内的元素是⽆序的,所以取出哪个元素实际是 未定义⾏为,即可以看作随机的。
  • 时间复杂度:O(N), n 是 count 返回值:取出的元素。

删除的顺序和插入的顺序无关,是随机的过程

如果我再次构造一个1 2 3 4这样的集合,此时还是通过4次spop进行删除,删除顺序是否还是1234呢?

由此可知,spop是一个随机的删除过程,并且在官方文档上也承认是真正随机的删除

srandmember

随机从key中获取count个随机元素

其实开发者开源码中,针对spop实现的时候,就采取了“生成随机数”的方式

smove

将⼀个元素从源 set 取出并放⼊⽬标 set 中:把member从source上删除,再插入到destination上

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

如果在key中添加1,此时再进行移动,会怎样?

key中元素减少,key2元素不变;还是会按照插入删除的顺序进行操作

如果要移动的元素不存在呢?

返回0表示失败

srem

将指定的元素从 set 中删除:可以一次删除一个member,也可以删除多个

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

集合间操作 

  • 交集(inter):最终结果同时出现在两个集合中
  • 并集(union):把多个集合中的数据都集中放在一起,如果元素有重复,也最终只保留一份
  • 差集(diff):A和B做差集,就是找出哪些元素,在A中存在,同时在B中不存在

sinter

  • 获取给定 set 的交集中的元素:此处每个key都对应一个集合
  • 时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数
  • 返回值:交集的元素。

sinterstore

  • 获取给定 set 的交集中的元素并保存到⽬标 set 中。
  • 时间复杂度:O(N * M), N 是最⼩的集合元素个数
  • M 是最⼤的集合元素个数. 返回值:交集的元素个数。
  • 要想直到交集中的元素,只需要按照访问集合的方式进行访问即可

sunion

  • 获取给定 set 的并集中的元素。
  • 时间复杂度:O(N), N为给定的所有集合的总的元素个数
  • 返回值:并集的元素。

sunionstore

  • 获取给定 set 的并集中的元素并保存到⽬标 set 中。
  • 时间复杂度:O(N), N 给定的所有集合的总的元素个数
  • 返回值:并集的元素个数。

sdiff

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

sdiffstore

  • 获取给定 set 的差集中的元素并保存到⽬标 set 中
  • 时间复杂度:O(N), N 给定的所有集合的总的元素个数
  • 返回值:差集的元素个数

set命令小结

序号命令及描述
1SADD key member1 [member2]
向集合添加一个或多个成员
2SCARD key
获取集合的成员数
3SDIFF key1 [key2]
返回第一个集合与其他集合之间的差异。
4SDIFFSTORE destination key1 [key2]
返回给定所有集合的差集并存储在 destination 中
5SINTER key1 [key2]
返回给定所有集合的交集
6SINTERSTORE destination key1 [key2]
返回给定所有集合的交集并存储在 destination 中
7SISMEMBER key member
判断 member 元素是否是集合 key 的成员
8SMEMBERS key
返回集合中的所有成员
9SMOVE source destination member
将 member 元素从 source 集合移动到 destination 集合
10SPOP key
移除并返回集合中的一个随机元素
11SRANDMEMBER key [count]
返回集合中一个或多个随机数
12SREM key member1 [member2]
移除集合中一个或多个成员
13SUNION key1 [key2]
返回所有给定集合的并集
14SUNIONSTORE destination key1 [key2]
所有给定集合的并集存储在 destination 集合中
15SSCAN key cursor [MATCH pattern] [COUNT count]
迭代集合中的元素

set内部编码

intset(整数集合)

为了节省空间,做出的特定的优化,当元素均为整数,并且元素个数不是很多的时候,内存数据库,更节省空间

hashtable(哈希表)

set的应用场景

使用set来保存用户的”标签“

  • 用户画像:分析出你这个人的一些特征(性别,年龄,居住地,爱好),分析清楚之后,再投其所好,所谓的标签就是用户的个人特征-简短的字符串
  • 此时就可以把标签保存到redis中的set中了,用户画像,这种事情其实是挺复杂的事情
  • set方便计算交集,很容易的找到两个用户之间的公共标签,基于这样的标签,衍生出一些”用户关系“

使用set来计算用户之间的共同好友

基于”集合求交集“,例如QQ两个用户都加了很多好友,可以得出用户之间的共同好友,基于上述还可以做一些好友推荐

使用set统计UV,使用去重

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

  1. PV-page view 用户每次访问该服务器,每次访问都会产生一个pv
  2. UV-user view 每个用户,访问服务器,都会产生一个uv,但是同一个用户多次访问,不会使uv增加,uv需要按照用户进行去重,上述的去重过程,就可以使用set来实现

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

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

相关文章

Java开发工具IDEA

IDEA概述 Intellij IDEA IDEA全称Intellij IDEA,是用于Java语言开发的集成环境,它是业界公认的目前用于Java程序开发最好的工具。 集成环境 把代码编写,编译,执行,调试等多种功能综合到一起的开发工具。 IDEA下载和安…

PDF在线预览实现:如何使用vue-pdf-embed实现前端PDF在线阅读

目录 PDF在线预览实现:如何使用vue-pdf-embed实现前端PDF在线阅读 一、前言 二、vue-pdf-embed是什么 1、作用与场景 2、vue-pdf-embed的优点 三、项目初始化与依赖安装 1、初始化Vue项目 2、安装依赖 3、集成vue-pdf-embed插件 四、一个实际的应用demo …

Java面试题精选:消息队列(一)

1、为什么使用消息队列 问题用意: 其实就是想问一下消息队列有哪些使用场景,你项目中什么业务场景用到了消息队列,有什么技术挑战。使用MQ后给你带来了什么好处 规范回答: 消息队列的常见使用场景很多,但比较核心的…

【漏洞修复】Tomcat中间件漏洞

1.CVE-2017-12615 抓包上传一句话木马 密码passwd 2.后台弱口令部署war包 先用弱口令登录网站后台 制作war包 将172.jsp压缩成.zip文件,修改后缀为.war 上传 蚁剑链接 3.CVE-2020-1938 Python2 CVE-2020-1938.py IP -p 端口 -f 要读取的文件 漏洞修复&#xf…

超越自我——带你学haproxy算法一遍过!!!

文章目录 前言介绍 静态算法static-rrfirst 动态算法roundrobinleastconn 其他算法source算法map-base 取模法一致性hashuriurI_param 取模法hdr 总结本文相关连接如下: 前言 本文相关连接如下: 如果想更多了解haproxy的相关知识,请点击&am…

HTTP协议和运行原理

HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。不仅仅适用于[服务器<–>客户端]也是适用于[服务器<–>服务器] HTTP 状态码 1xx 1xx 类状态码属于提示信息&#xff0c;是协议处理中的一种中间状态&#xff0c;实际…

操作系统 IO 相关知识

操作系统 IO 相关知识 阻塞与非阻塞同步与异步IO 和系统调用传统的 IODMAmmap 内存映射sendfilesplice 常用的 IO 模型BIO&#xff1a;同步阻塞 IONIO&#xff1a;同步非阻塞 IOIO 多路复用信号驱动 IOAIO&#xff1a;异步 IO 模型 IO 就是计算机内部与外部进行数据传输的过程&…

加密案例分享:电子设备制造行业

企业核心诉求选择 1.某企业规模庞大&#xff0c;分支众多&#xff0c;数据安全管理方面极为复杂&#xff1b; 2.企业结构复杂&#xff0c;包括研发、销售、财务、总部、分部、办事处、销售等单位连结成为一个庞大的企业组织&#xff0c;数据产生、存储、流转、使用、销毁变化…

NIO线程模型

NIO线程模型主要涉及以下几个方面&#xff1a; 一、基本概念 NIO&#xff08;New Input/Output&#xff09;是Java的一种新的输入输出模型&#xff0c;也被称为非阻塞IO。其核心特点是数据读写操作均是非阻塞的&#xff0c;即在进行读写操作时&#xff0c;若数据未准备好&…

第129天:内网安全-横向移动WmiSmbCrackMapExecProxyChainsImpacket

这里这个环境继续上一篇文章搭建的环境 案例一&#xff1a; 域横向移动-WMI-自带&命令&套件&插件 首先上线win2008 首先提权到system权限 wmic是windows自带的命令&#xff0c;可以通过135端口进行连接利用&#xff0c;只支持明文方式&#xff0c;优点是不用上传别…

【区块链+医疗健康】医链 - 区块链医疗信息管理系统 | FISCO BCOS应用案例

根据《“十四五”规划和 2035 远景目标纲要》&#xff0c;我国在“十四五”时期将全面推进医疗信息化建设。工信部等部 门联合发布《关于加快推动区块链技术应用和产业发展的指导意见》&#xff0c;促进区块链在医疗健康等公共服务领域开 展应用&#xff0c;促进业务协同办理。…

ES6 export import

1.Export 模块是独立的文件&#xff0c;该文件内部的所有的变量外部都无法获取。如果希望获取某个变量&#xff0c;必须通过export输出&#xff0c; 声明的同时导出变量、函数以及类 // profile.js export var firstName Michael; export var lastName Jackson; export var…

【JUC】Java对象内存布局和对象头

文章目录 面试题Object object new Object() 谈谈你对这句话的理解&#xff1f; 对象在堆内存中存储布局权威定义&#xff08;周志明老师JVM第三版&#xff09;对象在堆内存中的存储布局详解对象头的MarkWord源码对象标记源码 对象内存布局&#xff08;使用JOL证明&#xff09…

猫头虎 分享已解决Bug || java.lang.NullPointerException 解决方案

&#x1f42f; 猫头虎 分享已解决Bug || java.lang.NullPointerException 解决方案 在 后端开发过程中&#xff0c;我们经常会遇到各种各样的Bug。而其中最常见之一就是 java.lang.NullPointerException。很多小伙伴在遇到这个问题时&#xff0c;往往会感到非常头痛&#xff0…

设计模式-单一职责模式

DecoratorBridge Decorator 动机 在某些情况下我们可能会 “过度地使用继承来扩展对象的功能”&#xff0c;由于继承为类型引入的静态特质&#xff0c;使得这种扩展方式缺乏灵活性&#xff1b;并且随着子类的增多&#xff08;扩展功能的增多&#xff09;&#xff0c;各种子类的…

yolov8断点续训

1. 前言 我们在使用yolov8进行训练的时候往往会因为各种各样的原因中断训练&#xff0c;如&#xff1a; 开了太多程序导致崩溃突然断电其他原因 这时候如果下次能继续上次训练的结果继续训练会节省很多时间 2.复现与解决办法 2.1 正常启动训练 yolov8环境搭建与简单配置请…

给 Python 的第三方模块安装工具 pip 换源

sudo mkdir ~/.pipcd .pipsudo nano pip.conf[global] timeout 10 index-url http://mirrors.aliyun.com/pypi/simple/ extra-index-url http://pypi.douban.com/simple/ [install] trusted-hostmirrors.aliyun.compypi.douban.com喜欢或对你有帮助&#xff0c;点个赞吧&…

PMBOK® 第六版 规划范围管理

目录 读后感—PMBOK第六版 目录 规划范围管理就像是为项目划定清晰的界限&#xff0c;通过书面形式明确项目团队必须完成的工作&#xff0c;这有助于有效控制和交付目标产品&#xff0c;防止范围蔓延&#xff0c;合理分配资源&#xff0c;从而提高项目成功率和客户满意度。 一…

Tomcat搭建JSPServlet

一、Tomcat环境搭建 1. 将项目变为Web项目 选中项目&#xff0c;点击Help中的Find Action 搜索Add Framework Support 勾选Web Application 出现这些文件就是成功了 2. 配置Tomcat 点击Edit Configurations 点击加号&#xff0c;选择Tomcat Server Local Deployment栏下点击…

WPF篇(9)-CheckBox复选框+RadioButton单选框+RepeatButton重复按钮

CheckBox复选框 CheckBox继承于ToggleButton&#xff0c;而ToggleButton继承于ButtonBase基类。 案例 前端代码 <StackPanel Orientation"Horizontal" HorizontalAlignment"Center" VerticalAlignment"Center"><TextBlock Text"…