【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需要按照用户进行去重

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

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

相关文章

react-app-env.d.ts是什么?

react-app-env.d.ts这个文件是使用CRA脚手架生成react项目时自动生成的,在平时的开发过程中看到这个文件就会感觉很疑惑,出于好奇心,在网上查找资料,得出下文 前置知识 这个是一个类型声明文件 它的内容很短,就一行…

Nodejs的安装以及配置(node-v12.16.1-x64.msi)

Nodejs的安装以及配置 1、安装 node-v12.16.1-x64.msi点击安装,注意以下步骤 本文设置nodejs的安装的路径:D:\soft\nodejs 继续点击next,选中Add to PATH ,旁边的英文告诉我们会把 环境变量 给我们配置好 当然也可以只选择 Nod…

好消息,微信消费者投诉工具升级,可以直接回复用户、处理投诉了。。。

大家好,我是小悟 兄弟们,阅读本文之前,建议先阅读【连夜干出来一个自动处理【微信消费者投诉管理系统】,支持多商户】。 为了使工具更好用,也为帮助商户更好地处理消费者投诉,提升用户满意度,…

08 # 手写 filter 方法

什么是 filter filter() 方法创建给定数组一部分的浅拷贝,其包含通过所提供函数实现的测试的所有元素。如果没有元素通过测试,则返回一个空数组。 ele:表示数组中的每一个元素index:表示数据中元素的索引array:表示数…

光纤的跳线和尾纤区别

光纤跳线和光纤尾纤在结构上、连接方式、应用场景等方面存在明显的区别。 光纤跳线有0.9、2.0、3.0,通常是区分光缆外径的。0.9光缆外径0.9mm的,2.0光缆外径2mm,3.0光缆外径3mm。 同时分单模光纤跳线和多模光纤跳线。单模一般是黄色&#xff…

代码随想录算法训练营第四十二天丨 动态规划part05

1049.最后一块石头的重量II 思路 本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。 感觉和昨天讲解的416. 分割等和子集 (opens new window)非常像了。 本题物品的重量为 stones[i],物品的价…

地理信息系统原理-空间数据结构(7)

​四叉树编码 1.四叉树编码定义 四叉树数据结构是一种对栅格数据的压缩编码方法,其基本思想是将一幅栅格数据层或图像等分为四部分,逐块检查其格网属性值(或灰度);如果某个子区的所有格网值都具有相同的值&#xff0…

linux下IO模及其特点及select

ftp实现 模拟FTP核心原理:客户端连接服务器后,向服务器发送一个文件。文件名可以通过参数指定,服务器端接收客户端传来的文件(文件名随意),如果文件不存在自动创建文件,如果文件存在&#xff0c…

鸿蒙原生应用开发-DevEco Studio超级终端模拟器的使用

一、了解超级终端模拟器支持的设备情况 该特性在DevEco Studio V2.1 Release及更高版本中支持。 目前超级终端模拟器支持“PhonePhone”、“PhoneTablet”和“PhoneTV”的设备组网方式,开发者可以使用该超级终端模拟器来调测具备跨设备特性的应用/服务,如…

LEEDCODE 283移动零

class Solution { public:void moveZeroes(vector<int>& nums) {if(nums.size() > 1) {vector<int> a;// 找到0的位置int i 0;int right nums.size() - 1;while(i < right){if(nums[i] 0){for(int j i; j< right; j){swap(nums[j], nums[j1]);}ri…

接口测试及接口测试工具

首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给你…

于道 - 前端项目启动步骤参考

1. 安装 启动过程有9个步骤&#xff1a; 1.1 安装 Node JS , V18版本的 &#xff08;安装步骤省略&#xff09; 1.2 安装 npm install -g yarn &#xff0c;node JS里边好像自带npm &#xff0c;通过npm的命令安装 yarn 1.3 切换到项目中去安装&#xff0c;npm install &a…