深入学习 Redis - 深挖经典数据类型之 set

目录

前言

一、Set 类型

1.1、操作命令

sadd / smembers(添加)

sismember(判断存在)

scard(获取元素个数)

spop(删除元素)

smove(移动) 

 srem(删除)

sinter / sinterstore(交集 / 存储)

sunion / sunionstore(并集 / 存储)

sdiff / sdiffstore(差集 / 存储)

1.2、set 的内部编码方式

1.3、使用场景

用户画像(set 保存用户 “标签”)

共同好友

统计 UV(去重)


前言


redis 中所有的 key 都是字符串,value 的类型是存在差异的,因此出现了操控不同 value 的命令,接下来,就一起来学习一下吧~

Ps1:接下来,我给出的指令都是按照 Redis 官方文档的语法格式来解析的,[ ] 相当于一个独立的单元,表示可选项(可有可无),其中 | 表示 “或者” 的意思,多个只能出现一个,[ ] 和 [ ] 之间是可以同时存在的.

Ps2:一个快速失去年终奖的小技巧 —— 清除 redis 上所有的数据 =》 FLUSHALL,这个操作可以把 redis 上所有的键值对全部带走.

Ps3:不同操作返回值差别挺大,很容易记混,不用可以去背,经常使用的操作,自然就记住了.

一、Set 类型


1.1、操作命令

redis 中的 set 就是一个集合,集合就是把一些关联的数据放在一起,我们把集合中的元素叫 member ,具有以下特殊的特性:

  1. 集合中的元素是无序的.
  2. 集合中的元素是唯一的,不能重复.
  3.  和 list 类似,集合中的每个元素都是 string 类型的,同时也可以使用 json 这样的格式让 string 存储 结构化 的数据.

Ps:这里提到的到无序,对应前面讲到的 list.

list: [1, 2, 3] 和 [2, 1, 3] 是两个不同的 list.

set: [1, 2, 3] 和 [2, 1, 3] 是两个相同的 set.

sadd / smembers(添加)

将一个或多个元素添加到 set 中,返回值是成功添加的元素个数. 注意,重复的元素会添加失败.

SADD key member [member ...]

获取一个 set 中所有的元素. 注意,返回的元素是无序的.

SMEMBERS key

sismember(判断存在)

判断一个元素是否在 set 中,返回 1 表示存在,0表示不存在.

SISMEMBER key member

scard(获取元素个数)

用来获取 set 中元素的个数.

SCARD key

 

spop(删除元素)

pop 一般表示 “从末尾” 删除一个元素,集合中的元素都是无序的,末尾是什么呢?在 redis 的 set 中,使用 spop 表示随机删除一个元素.

SPOP key [count]

通过 count 参数可以指定删除的个数,没写就是默认删除这一个.

smove(移动) 

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

返回 1 表示移动成功.

返回 0 表示移动失败,但是 source 中删除成功,只是 destination 中不能出现重复元素(destination 中含有新插入的元素).

SMOVE source destination member

 

 srem(删除)

可以一次删除一个 或 多个 member ,返回值表示删除元素的个数.

SREM key member [member ...]

sinter / sinterstore(交集 / 存储)

交集就是在两个集合中都有的元素,通过 sinter 就可以获取多个元素的之间的交集,时间复杂度为 O(N*M),N 是最小的集合元素个数,M 是最大集合的元素个数.

SINTER key [key ...]//此处 key 对应一个集合,返回值就是最终交集的数据.

sinterstore 用来将算好的交集,放到 destination 这个 key 对应的集合中

SINTERSTORE destination key [key ...]

 

sunion / sunionstore(并集 / 存储)

并集就是两个集合的数据全集,sunion 就是返回并集的结果数据,时间复杂度为 O(N),N 表示总的元素个数.

SUNION key [key ...]

sunionstore 直接把并集的结果存储到 destination 对应的集合中,返回值事并集的元素个数.

SUNIONSTORE destination key [key ...]

 

sdiff / sdiffstore(差集 / 存储)

差集,A 和 B 做差集,就是找出哪些元素在 A 中存在,同时 B 中不存在(B 和 A 做差集则相反).

SDIFF key [key ...]

 

 

sdiffstore 就是将差集的结果放在 destination 中,时间复杂度为 O(N).

SDIFFSTORE destination key [key ...]

1.2、set 的内部编码方式

 set 内部有两种编码方式:

  1. intset:整数集合,当所有元素均为整数,并且元素个数不是很多的时候,为了节省空间,做出的特定优化.
  2. hashtable:最基本的哈希表(不是 java 标准库中的 HashTable),redis 内部对哈希表的实现方式和 java 中的哈希表可能不太一样,但是整体思想都是一样的;时间上复杂度O(1),但是空间上会有一定的浪费(hash 是一个数组,数组上有些位置有元素,有些位置没有元素).

 

1.3、使用场景

用户画像(set 保存用户 “标签”)

通过你对这个服务器访问的数据,分析出你这个人的一些特征,之后再 “投其所好”~

抖音这款软件在这方面做的就尤为突出,他会根据用户经常观看收藏点赞那种类型的视频,就能看出你这个人的 性别、年龄、居住地、爱好... 通过这个过程,就会将这些特征,就会转换成标签保存到 redis 的 set 中,之后就会给你推送与这些标签相关的视频内容.

共同好友

基于 set 的 “集合求交集” 就可得到两个用户之间的 “用户关系”

在 QQ 上,我这边加了很多好友,你这边也加了很多好友,这样系统就可以做到好友推荐:

A 的好友中有 B 和 C.

D 的好友中也有 B 和 C.

系统就会把 A 推荐给 D.

统计 UV(去重)

利用 set 的去重机制,衡量用户规模.

一个互联网产品衡量用户规模,主要就是两个指标:

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

UV:user view ,每个用户访问服务器,都会产生一个 uv,但是同一个用户多次访问,不会使 uv 增加,这就需要基于 set 实现去重.

 

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

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

相关文章

Golang time 包以及日期函数

time 包 在 golang 中 time 包提供了时间的显示和测量用的函数。 time.Now()获取当前时间 可以通过 time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息。 示例代码如下: package mainimport ("fmt""time" )…

Redis原理篇(二)

Redis原理 Redis数据结构 Redis网络模型 RESP协议 Redis内存回收 Redis原理篇 一、原理篇-Redis数据结构 1.1 Redis数据结构-动态字符串 我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不…

网络安全 Day19-计算机网络基础知识04(网络协议)

计算机网络基础知识04(网络协议) 1. ARP1.1 ARP通讯原理1.2 arp欺骗1.3 ARP欺骗与预防1.4 排查ARP病毒 2. DHCP工作原理(自动分配内网IP)3. TCP协议三次握手、四次挥手原理4. DNS协议工作原理 1. ARP Linux查看arp:ar…

聊聊STM32 ADC的话题

STM32 微控制器系列提供了多个模拟数字转换器(ADC)模块,用于实现模拟信号的采集和转换为数字信号。ADC 在很多应用中都是非常重要的,例如传感器数据采集、电压测量等。 在 STM32 中,ADC 可以通过 STM32HAL 库提供的函…

自动驾驶感知系统-超声波雷达

超声波雷达,是通过发射并接收40kHz的超声波,根据时间差算出障碍物距离。其测距精度是1~3cm.常见的超声波雷达有两种:第一种是安装在汽车前后保险杠上的,用于测量汽车前后障碍物的驻车雷达或倒车雷达,称为超声波驻车辅助…

时间复杂度和空间复杂度

在计算机科学中,算法的效率是一个重要的概念。算法的效率可以通过复杂度来度量,其中包括时间复杂度和空间复杂度。 了解算法的复杂度对于程序员来说非常重要。在解决实际问题时,我们需要选择合适的算法来保证程序的性能和效率。因此&#xff…

【前端笔记】本地运行cli项目报错ERR_OSSL_EVP_UNSUPPORTED

报错原因 Node版本>17.x,本地npm run 起项目后会发现终端报错,具体有以下2块关键信息: Error: error:0308010C:digital envelope routines::unsupported和 opensslErrorStack: [ error:03000086:digital envelope routines::initializa…

SpringCloud学习路线(9)——服务异步通讯RabbitMQ

一、初见MQ (一)什么是MQ? MQ(MessageQueue),意思是消息队列,也就是事件驱动架构中的Broker。 (二)同步调用 1、概念: 同步调用是指,某一服务…

ProtoBuf入门概念

目录: 序列化概念ProtoBuf是什么ProtoBuf的使⽤特点安装ProtoBuf如何学习ProtoBuf 1.序列化概念 序列化和反序列化 序列化:把对象转换为字节序列的过程称为对象的序列化。反序列化:把字节序列恢复为对象的过程称为对象的反序列化。 什么…

【搜索引擎Solr】Apache Solr 神经搜索

Sease[1] 与 Alessandro Benedetti(Apache Lucene/Solr PMC 成员和提交者)和 Elia Porciani(Sease 研发软件工程师)共同为开源社区贡献了 Apache Solr 中神经搜索的第一个里程碑。 它依赖于 Apache Lucene 实现 [2] 进行 K-最近邻…

【Python笔记】Python + xlrd + pymysql读取excel文件数据并且将数据插入到MySQL数据库里面

这篇文章,主要介绍Python xlrd pymysql读取excel文件数据并且将数据插入到MySQL数据库里面。 目录 一、Python读取excel 1.1、安装xlrd库 1.2、打开excel工作簿 1.3、获取sheet工作表 1.4、操作row数据行 1.5、操作column数据列 1.6、操作单元格 二、读取…

Bean 作用域和生命周期

1.通过⼀个案例来看 Bean 作⽤域的问题 假设现在有⼀个公共的 Bean,提供给 A ⽤户和 B ⽤户使⽤,然⽽在使⽤的途中 A ⽤户却“悄悄”地修 改了公共 Bean 的数据,导致 B ⽤户在使⽤时发⽣了预期之外的逻辑错误。 1.1 被修改的 Bean 案例 公…

openfeign调用文件服务的文件上传接口报错:Current request is not a multipart request

解决办法&#xff1a; Api 接口 Api(tags "文件上接口") RestController public class FileController {Autowiredprivate FileFeignService fileFeignService;ApiOperation("上传文件")PostMapping(value "/uploadFile")public ResData<…

入门前端监控

背景 前端监控是指通过一系列手段对Web页面或应用程序进行实时监控和数据采集&#xff0c;以了解页面或应用程序的性能状况、用户行为等等&#xff0c;并及时发现和解决潜在的问题。一个完整的前端监控平台可以包括&#xff1a;数据收集与上报、数据整理与存储、数据展示这里仅…

Java连锁门诊医院HIS信息管理系统源码

Java连锁门诊医院HIS信息管理系统源码&#xff1a;SaaS运维平台多医院多机构多门诊入驻强大的电子病历完整开发文档 一、系统概述 ❉采用主流成熟技术&#xff0c;软件结构简洁、代码规范易阅读&#xff0c;SaaS应用&#xff0c;全浏览器访问前后端分离&#xff0c;多服务协同…

通过两种实现方式理解CANoe TC8 demo是如何判断接收的以太网报文里的字段的

假设有一个测试用例,需求是:编写一个测试用例,发送一条icmpv4 echo request报文给DUT,identifier字段设置为10。判断DUT能够回复icmpv4 echo reply报文,且identifier字段值为10。 实现:在canoe的simulation setup界面插入一个test节点,ip地址为:192.168.0.1,mac地址为…

具身智能,是机器人的“冷饭热炒”吗?

大模型正如火如荼&#xff0c;下一个AI风口就来了。 如果你关注2023世界人工智能大会等行业峰会&#xff0c;以及英伟达、微软、谷歌、特斯拉和国內科技大厂的最新发布会&#xff0c;除了“大模型”&#xff0c;应该会听到另一个高频词——具身智能。 所谓具身智能Embodied AI …

IRIS搭建docker

之前把web实现了docker&#xff0c;开发或测试环境可能需要开发自己搭数据库&#xff0c;为了方便使用&#xff0c;把数据库也做一个docker。 由于原生的CentOS我还有改yum仓库&#xff0c;所以这次从之前lis搞的改好yum的镜像开始&#xff08;从改好yum的lisnew的镜像创建lis…

【Linux】Ubuntu基本使用与配置, 以及常见问题汇总(一)

前言 大学期间&#xff0c;感觉很多时候学习课外知识都是被推着往前走&#xff0c;很多内容并没有深入去学习&#xff0c;知识的记录受限于所学比较片面&#xff0c;如今渐渐意识到似乎并没有建立起相关知识的体系架构&#xff0c;缺乏一个系统学习并整理的过程。本文将以Ubunt…

grid map学习笔记1之Ubuntu18.04+ROS-melodic编译安装grid_map栅格地图及示例运行

文章目录 0 引言1 安装依赖和编译1.1 安装依赖1.2 下载编译 2 运行示例2.1 simple_demo2.2 tutorial_demo2.3 iterators_demo2.4 image_to_gridmap_demo2.5 grid_map_to_image_demo2.6 opencv_demo2.7 resolution_change_demo2.8 filters_demo2.9 interpolation_demo 0 引言 苏…