Redis常见数据类型(6)-set, zset

目录

Set

命令小结

内部编码

使用场景

用户画像

其它

Zset有序集合

普通指令

zadd

zcard

zcount

zrange

zrevrange

​编辑 

 zrangebyscore

zpopmax/zpopmin

bzpopmax/bzpopmin

zrank/zrevrank

zscore

zrem

 zremrangebyrank

zremrangebyscore


Set

命令小结

命令功能时间复杂度
sadd key element [element...]向集合添加元素O(k), k是元素个数
srem key element [element...]删除集合中的元素O(k), k是元素个数
scard key求集合中的元素数目O(1)
sismember key element判断一个元素是否在集合内O(1)
srandmember key [count]在集合中随机获取count个元素O(count)
spop key [count]在集合中随机删除count个元素O(count)
smembers key获取集合中的所有元素O(k), k是元素个数
sinter key [key...] sinterstore求多个集合的交集O(m * k)
sunion key [key...] sunionstore求多个集合的并集O(k), k是多个集合元素个数的总和
sdiff key [key...] sdiffstore求多个集合的差集O(k), k是多个集合元素个数的总和

内部编码

集合中的内部编码有两种: 

intset(整数集合): 当集合中的元素都是整数并且元素的个数小于set-max-intset-entires配置时, Redis会选用intset来作为集合的内部实现, 从而减少内存的使用. 

hashtable(哈希表): 当集合类型无法满足intset的条件时, Redis会使用hashtable作为集合的内部实现. 

 

使用场景

用户画像

集合类型比较典型的使用场景就是用户画像, 例如在抖音中, 用户A对美女跳舞, 唱跳rap篮球感兴趣, 用户B对历史, 二次元游戏感兴趣, 那么这些特征就会被记录为用户画像, 这些数据对提升用户体验和用户黏度就非常有帮助.

其它

在社交软件中查找共同好友. 以及互联网产品中衡量用户量, 用户规模非常有帮助(主要是按照浏览量等指标来确定, 如果同一个用户多次访问, 就会去重访问信息, 这样有助于准确地提供用户规模等信息). 

Zset有序集合

简而言之, 它还是一种集合, 但是与集合不同, 它在里面引入了一个浮点类型 -- 分数(score)这个概念, 我们可以通过这个分数作为排序依据, 使其有序(之前如list中是使用下标的概念).  

比如我们按照伤害对如下植物进行排序:

有序集合提供了指定分数和元素的范围查找, 计算成员排名等功能, 合理利用有序集合, 能解决很多问题.

普通指令

zadd

功能: 添加或者更新指定的元素以及关联的分数到zset中, 分数应该符合double类型

语法: 

zadd key [nx | xx] [gt | lt] [ch] [incr] score member [score member...] (注: 分数可重复)

相关选项介绍: 

xx|nx: xx仅仅用于更新存在的元素, 不添加新元素; nx可以更新未存在的元素(不写默认为nx)

gt | lt : 如果要更新分数, 发现比现在给定的分数大(小), 此时就更新成功, 否则不更新.

ch: 默认情况下, zadd返回的是本次添加的元素个数, 但指定这个选项之后, 就会还包含本次更新的元素个数.

incr: 此时命令类似zincrby 的效果, 将元素分数加上指定的分数, 此时只能指定一个元素/分数. 

时间复杂度: O(logN): 因为要找到插入元素的位置, 就会使用类似二分查找这种方式寻找.

返回值:  本次添加的元素个数.

 

其余参数可以自行测试.

zcard

功能: 获取zset中的元素数目

语法:

zcard key

返回值: zset中的元素个数. 

zcount

功能: 返回分数在min和max之间的元素个数, 默认情况下, min和max都是包含的, 可以通过 ( 排除.即一般情况下为闭区间, 使用(的那个数字的那个部分是开区间.

语法:

zcount key min max

时间复杂度: O(logN), 因为实际上在Zset内能够得知元素的位次, 因此我们只需要定位到min和max的位次, 然后相减即可. 

返回值: 满足条件的元素列表个数 

 

zrange

功能: 返回指定区间里的元素, 分数按照升序排序. 带上withscores可以把分数也返回.

语法:

 zrange key start stop [withscores]

此处的[start, stop]为下标构成的区间,  从0开始, 支持负数.

时间复杂度: O(logN + M), 先找到start/ stop, 然后M是指start与stop之间的元素数目.

返回值: 区间里的元素列表.

zrevrange

功能: 返回指定区间里的元素, 分数按降序排序, 带上withscores也可以将分数返回.

语法:

zrevrange key start stop [withscores]

时间复杂度: O(logN + M)

返回值: 区间元素列表.

 

 zrangebyscore

返回分数在min, max之间的元素, 默认情况下, min和max都是包含的, 可以通过 ( 排除.

语法:

zrangebyscore key min max

时间复杂度: O(logN + M)

返回值: 区间的元素列表 

zpopmax/zpopmin

删除并返回分数最高/低的count个元素

语法:

zpopmax/zpopmin key [count]

时间复杂度: O(logN * M) N是有序集合数目, M是要删除数目, 虽然我们记录了次序, 但我们是通过M次普通删除(每次删一个), 因此时间复杂度是这个.

返回值: 分数和元素列表.

bzpopmax/bzpopmin

功能: zpopmax/zpopmin阻塞版本.

语法:

bzpopmax/bzpopmin key [key...] timeout 

时间复杂度: O(N)

zrank/zrevrank

功能: 返回指定元素的排名, 升序/降序

语法:

zrank/zrevrank key member

时间复杂度: O(logN)

返回值, 排名. 

 

zscore

 功能: 返回指定元素的分数.

语法:

zscore key member

时间复杂度: O(1) 

返回值: 分数

zrem

功能: 删除指定元素.

语法:

zrem key member [member...] 

时间复杂度: O(M * logN)

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

 zremrangebyrank

功能: 按照排序, 升序删除指定范围的元素, 左闭右闭.

语法:

zremrangebyrank key start stop

时间复杂度: O(logN + M)

返回值: 本次操作的元素个数.

zremrangebyscore

功能: 按照分数删除指定范围的元素, 左闭右闭.

语法

zremrangebyscore key min max

时间复杂度: O(logN + M)

返回值: 本次操作删除的元素数目. 

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

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

相关文章

AI绘画基础,建议用天工 AI 搞副业,30 分钟搞定儿童早教内容

现在 AI 非常火,竞争也非常激烈,尤其是国内的 AI 大模型堪称百团大战,非常内卷。 我研究 AI 大模型也有快一年的时间了,也体验了国内的很多大模型,然后我感觉如果单从用户体验的角度来讲,综合产品力最强的…

FPGA状态机设计详解

一.什么是状态机? 想象一下你正在玩一个电子游戏,角色有多种状态,比如“行走”、“跳跃”、“攻击”等。每当你按下不同的按键或者满足某些条件时,角色的状态就会改变,并执行与该状态对应的动作。这就是状态机的一个简…

修改vuetify3的开关组件v-switch在inset模式下的大小

<v-switchv-model"model":label"Switch: ${model.toString()}"hide-detailsinset></v-switch><style lang"scss" scoped> .custom-switch {:deep(.v-switch__thumb) {height: 18px !important; /* 设置开关按钮的高度 */width…

html 引用vue3 element 首次加载缩成一团 挤在一起

问题&#xff1a;原生html引用vue,element plus 分析&#xff1a; vue.js, element脚本过大&#xff0c;首次加载网络慢的话&#xff0c;会是缩在这里&#xff0c;没完全渲染 解决&#xff1a; 没加载之前&#xff0c;不显示div&#xff0c;显示一个加载提示语 改动地方app…

ISCC 2024 部分wp

文章目录 一、Misc1、Number_is_the_key2、FunZip3、擂台—— 重“隐”&#xff1b;4、RSA_KU5、时间刺客6、成语学习7、 精装四合一8、钢铁侠在解密9、有人让我给你带个话10、Magic_Keyboard11、工业互联网模拟仿真数据分析 二、Web1、还没想好名字的塔防游戏2、代码审计3、原…

curl: (60) SSL certificate problem: self-signed certificat

目录&#xff1a; 1、背景2、测试结果 1、背景 今天帮忙客户排查问题&#xff0c;报错请求超时&#xff0c;但是ping客户的ip以及测试端口都是通的&#xff0c;最终不得不从中台服务器上发起请求客户回调接口&#xff0c;报错如下&#xff1a; 怀疑是客户的证书有问题&#xf…

代码随想录算法训练营第十七天(py)| 二叉树 | 513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树

513.找树左下角的值 力扣链接 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 思路 层序遍历 层序遍历之后&#xff0c;取最后一个数组的第一个元素 class Solution:def findBottomLeftValue(self, root: Optional[TreeNode]) -> …

Python线程

Python线程 1. 进程和线程 先来了解下进程和线程。 类比&#xff1a; 一个工厂&#xff0c;至少有一个车间&#xff0c;一个车间中至少有一个工人&#xff0c;最终是工人在工作。 一个程序&#xff0c;至少有一个进程&#xff0c;一个进程中至少有一个线程&#xff0c;最终…

C++初探_右值引用

左值&#xff1a;在内存中有确定的存储地址。 右值&#xff1a;可出现在赋值表达式右边。包括&#xff1a;字面常量、诸如xy等的表达式&#xff0c;以及返回值的函数。 代码&#xff1a; #include <iostream> using namespace std;int main() {int x 10;int y 13;int…

⌈ 传知代码 ⌋ 基于扩散模型的无载体图像隐写术

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

Mybatis-Plus笔记

1.MP基础 1.1 MP常见注解 TableName(“指定表明”) TableName("tb_user") // 指定表名 Data NoArgsConstructor AllArgsConstructor Builder public class User {private Long id;private String userName;private String password;private String name;private I…

软件设计师备考 | 案例专题之数据流图 概念与例题

案例分析专题大纲&#xff1a; 数据流图基本概念 基本图形元素&#xff1a;外部实体、加工、数据存储、数据流 数据流&#xff1a;由一组固定成分的数据组成&#xff0c;表示数据的流向。在DFD中&#xff0c;数据流的流向必须经过加工。加工&#xff1a;描述了输入数据流到输出…

Ubuntu22.04虚拟机设置静态IP

虚拟机设置静态IP 按下电脑的 “win”键&#xff0c;在弹出的输入框中输入“控制面板”&#xff0c;选中控制面板 1.选择 “网络和Internet” 2.选择 “网络和共享中心” 3.选择 “更改适配器设置” 4.选择 “VMnet8”&#xff0c;双击打开 5.选择 “属性” 找到 “Internet …

【游戏引擎】Unity动画系统详解

持续更新。。。。。。。。。。。。。。。 【游戏引擎】Unity动画系统详解 Unity动画系统详解简介关键帧动画创建关键帧动画的步骤&#xff1a; Mecanim动画系统Mecanim的关键组件&#xff1a;使用Mecanim创建动画的步骤&#xff1a; 动画控制器动画控制器的高级功能&#xff1a…

AI预测福彩3D采取888=3策略+和值012路一缩定乾坤测试5月25日预测第1弹

上一套算法采用了88723的容差策略&#xff0c;关于容差策略相信大家都比较清楚&#xff1a;容差可以最大限度的保证初始大底中包含中奖号码&#xff0c;然后再通过设置一些杀号条件进行缩水。比如&#xff0c;我对我的各种模型算法近30期的预测结果进行了统计&#xff0c;如果采…

动态代理,反射,注解的复习笔记

1.动态代理的作用 动态代理最主要的用途就是在各种框架中&#xff0c;很方便的在运行期间生成代理类&#xff0c;通过代理类就可以完成AOP、过滤器、拦截器等操作 &#xff08;注&#xff1a;代理就是被代理者没有能力或者不愿意去完成某件事情&#xff0c;需要找个人代替自己…

浏览器的一些功能

1.改主页面 点浏览器右上角的三个点也就是一个... 点了设置 你可以在这里改它的颜色 还有页面 一些有意思的网站: sandspiel像素风格游戏 趣味互动游戏&#xff1a;请画一个小人 (webhek.com)​​​​​​ 2018 - makemepulse解压游戏 Layered Water (vlucendo.com)水模…

《计算机网络微课堂》2-2 物理层下面的传输媒体

请大家注意&#xff0c;传输媒体不属于计算机网络体系结构的任何一层&#xff0c;如果非要将它添加到体系结构中&#xff0c;‍‍那只能将其放在物理层之下。 传输媒体可分为两类&#xff1a;一类是导引型传输媒体&#xff0c;‍‍另一类是非导引型传输媒体。 在导引型传输媒体…

测试网0撸大毛 — AI 公链ALIENX推出HAL Testnet活动(含保姆级教程)

近期&#xff0c;OpenAI推出了新一代的GPT-4o让AI再次获得关注。AI硬件销售商英伟达的股价也突破1000美元&#xff0c;市值攀升到2.6万亿美元。AI继续影响到我们生活的方方面面。 在加密货币行业&#xff0c;市场行情也逐渐走出低谷。以太坊现货ETF被批准&#xff0c;为整个市场…

小程序主体变更是通过迁移吗?是需要2个小程序吗?

小程序迁移变更主体有什么作用&#xff1f;好多朋友都想做小程序迁移变更主体&#xff0c;但是又不太清楚具体有啥用&#xff0c;今天我就来详细说说。首先&#xff0c;小程序迁移变更主体最重要的作用就是可以修改主体。比如你的小程序原来是 A 公司的&#xff0c;现在 A 公司…