Redis 中 Set 和 Zset 类型

目录

1.Set类型

1.1 Set集合

1.2 普通命令

1.3 集合操作

1.4 内部编码

1.5 使用场景

2.Zset类型

2.1 Zset有序集合

2.2 普通命令

2.3 集合间操作

2.4 内部编码

2.5 使用场景


1.Set类型

1.1 Set集合

集合类型也是保存多个字符串类型的元素,但是和列表类型不同的是,集合中的元素是无序的,并且不允许重复,Redis除了支持集合内的增删改查操作,同时还支持多个集合取交集、并集、差集

集合类型

1.2 普通命令

SADD

将一个或者多个元素添加到set中,重复的元素无法添加到set中

语法:

SADD key member [member ...]

时间复杂度:O(1)

返回值:添加成功的元素个数

SMEMBERS

获取一个 set 中的所有元素,元素之间的顺序是无序的

语法:

SMEMBERS key

时间复杂度:O(N)

返回值:所有元素的列表 

SISMEMBER

判断一个元素在不在 set 中

语法:

SISMEMBER key member

时间复杂度:O(1)

返回值:1表示元素在 set 中,0表示不在 set 中或者 key 不存在

SCARD

获取 set 中元素的个数

语法:

SCARD key

时间复杂度:O(1)

返回值:set 内元素的个数

SPOP

从 set 中删除并返回一个或者多个元素,由于 set 中元素是无序的,所以取出的元素是随机的

语法:

SPOP key [count]

count代表个数,不写表示随机删除一个,写的时候,写几个就删除几个

时间复杂度:O(N),N为count

返回值:取出的元素

SMOVE

将一个元素从源 set 取出并放入目标 set 中

语法:

SMOVE source destination member

时间复杂度:O(1)

返回值:1表示成功,0表示失败

如果继续给key1里面添加一个1,然后再把这个1移动到key2,smove也会按照删除插入执行

SREM

将指定的元素从 set 中删除

语法:

SREM key member [member ...]

时间复杂度:O(N),N为要删除元素的个数

返回值:删除元素的个数

1.3 集合操作

交集(inter)、并集(union)、差集(diff)

SINTER

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

语法:

SINTER key [key ...]

时间复杂度:O(N * M),N是最小的集合元素个数,M是最大的集合元素个数

返回值:交集的元素

SINTERSTORE

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

语法:

SINTERSTORE destination key [key ...]

时间复杂度:O(N * M),N是最小的集合元素个数,M是最大的集合元素个数

返回值:交集的元素个数

SUNION

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

语法:

SUNION key [key ...]

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

返回值:并集的元素

SUNIONSTORE

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

语法:

SUNIONSTORE destination key [key ...]

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

返回值:并集的元素个数

SDIFF

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

语法:

SDIFF key [key ...]

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

返回值:差集的元素

SDIFFSTORE

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

语法:

SDIFFSTORE destination key [key ...]

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

返回值:差集的元素个数

1.4 内部编码

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

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

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

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

当元素不是整数时,内部编码为 hashtable:

1.5 使用场景

1)标签

集合类型比较典型的使用场景是标签,例如A用户对娱乐、体育感兴趣,B用户对游戏、综艺感兴趣,这些兴趣点可以被抽象成标签

给用户添加标签

sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag2 tag3 tag5
...
sadd user:k:tags tag1 tag2 tag4

给标签添加用户

sadd tag1:users user:1 user:3
sadd tag2:users user:1 user:2 user:3
...
sadd tagk:users user:1 user:4 user:9 user:28

删除用户下的标签 

srem user:1:tags tag1 tag5
...

删除标签下的用户

srem tag1:users user:1
srem tag5:users user:1
...

计算用户的共同兴趣标签

sinter user:1:tags user:2:tags

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

对两个用户的好友总数取交集

3)使用 set 统计 UV

PV:表示用户每次访问服务器,都会产生一个PV

UV:表示每个用户访问服务器,都会产生一个UV,但是同一个用户多次访问,不会增加UV

2.Zset类型

2.1 Zset有序集合

有序集合中可以存在重复的元素,与集合不同的是,有序集合中的每个元素都有一个唯一的浮点类型的分数(score)与之关联,使得有序集合中的元素是可以维护有序性的,在进行排序的时候就是根据分数(score)的大小来说进行升序/降序排序

列表、集合、有序集合三者的异同点

2.2 普通命令

ZADD

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

NX:用于添加新元素,不会更新已经存在的元素

XX: 用于更新已经存在的元素,不会添加新元素

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

INCR:将元素的分数加上指定的分数,此时只能指定一个元素和分数

语法:

ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member
...]

时间复杂度:O(logN)

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

注意:hash、set、list很多时候添加一个元素的时间复杂度都是O(1),由于zset是有序结构,它要为新添加的元素取寻找合适的位置,之所以是logN不是N,是因为zset内部的数据结构是跳表

实际上zset内部就是按照升序的方式来排序的,如果两个元素的分数相同,就按照字符串的字典序来进行排序

如果修改了分数,影响了之前的顺序,就会自动移动元素位置,保持升序的顺序不变,此处只修改没有添加返回值就是0

添加新的元素,此处的返回值就是1

加上ch这个选项,更新元素之后,返回值就是更新元素的个数

给元素加上指定的分数,返回值就是最终的分数,只能指定一个元素和分数

ZCARD

获取一个zset中元素的个数

语法:

ZCARD key

时间复杂度:O(1)

返回值:zset内的元素个数

ZCOUNT

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

语法:

ZCOUNT key min max

时间复杂度:O(logN)

zcount先根据 min 找到对应的元素, 再根据 max 找到对应的元素,zset 会记录每个元素当前的次序,查询到元素,就知道了元素的次序,然后直接把 max 对应的元素和 min 对应的元素次序做减法

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

包含 50 和 77

排除 50 和 77

ZRANGE

返回指定区间的元素,分数按照升序,加上 WITHSCORES 可以把分数也返回

语法:

ZRANGE key start stop [WITHSCORES]

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

此处要根据次序(下标)找到边界值,时间复杂度就是zcount的时间复杂度O(logN),而 M 是 start  和 stop之间的元素个数

返回值:区间内的元素列表 

ZREVRANGE

返回指定区间的元素,分数按照降序

语法:

ZREVRANGE key start stop [WITHSCORES]

时间复杂度:O(logN)

返回值:区间内的元素列表 

ZRANGEBYSCORE

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

语法:

ZRANGEBYSCORE key min max [WITHSCORES]

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

返回值:区间内的元素列表

ZPOPMAX

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

语法:

ZPOPMAX key [count]

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

N 是有序集合的元素个数,M 是要删除元素的个数,count 不写表示删除一个,写几就删除几个

返回值:分数和元素列表

BZPOPMAX

ZPOPMAX 的阻塞版本 

语法:

BZPOPMAX key [key ...] timeout

时间复杂度:O(logN)

时间复杂度是 logN,是因为从 key 上面只删除了一次元素

返回值:元素列表

ZPOPMIN

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

语法:

ZPOPMIN key [count]

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

返回值:分数和元素列表

BZPOPMIN

ZPOPMIN的阻塞版本

语法:

BZPOPMIN key [key ...] timeout

时间复杂度:O(logN)

返回值:元素列表

ZRANK

返回指定元素的排名,升序

语法:

ZRANK key member

时间复杂度:O(logN)

返回值:排名

ZREVRANK

返回指定元素的排名,降序

语法:

ZREVRANK key member

时间复杂度:O(logN)

返回值:排名

ZSCORE

返回指定元素的分数

语法:

ZSCORE key member

时间复杂度:O(1)

返回值:分数

ZREM

删除指定的元素

语法:

ZREM key member [member ...]

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

N 是整个有序集合中元素个数,M 是 member 的个数

返回值:删除元素的个数

ZREMRANGEBYRANK

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

语法:

ZREMRANGEBYRANK key start stop

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

N 是整个有序几个的元素个数,M 是 start - stop 区间中元素的个数,此处只需要进行一次查找

返回值:删除元素的个数

ZREMRANGEBYSCORE

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

语法:

ZREMRANGEBYSCORE key min max

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

返回值:删除元素的个数

ZINCRBY

为指定的元素加上指定的分数

语法:

ZINCRBY key increment member

时间复杂度:O(logN)

由于增加后的元素可能会改变原有的位置,此时需要保证有序集合中的元素仍然是升序的,因此时间复杂度为 logN

返回值:增加后元素的分数

2.3 集合间操作

ZINTERSTORE

求出给定有序集合中元素并保存到目标集合中,在合并过程中以元素为单位进行合格,元素对应的分数按照不同的聚合方式和权重重新得到新的分数

语法:

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight
[weight ...]] [AGGREGATE <SUM | MIN | MAX>]

destination:要把结果存储到哪个 key 对应的 zset 中

numkeys:整数,表示有几个 key 参与交集运算 ,前面的命令中不涉及到 numkeys,此处涉及到numkeys是为了明确知道后面的选项从哪开始了(类似面向字节流的粘包问题),如果没有这个整数,就无法知道有几个 key 参与

weight:权重

sum: 求和        min:取最小        max:取最大

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

N是输入的有序集合中最小的有序集合的元素个数,K表示几个有序集合,M是最终结果的有序集合的元素个数

返回值:目标集合中的元素个数

对 key1 * 2,key2 * 3之后,再将他们相加,得到最终结果

对 key1 和 key2 求交集,取最小值

对 key1 和 key2 求交集,取最大值 

在有序集合中,member 才是元素的本体,而 score 只是辅助的,因此,在进行求交集时,只要 member相同就行

ZUNIONSTORE

求出给定有序集合中元素的并集并保存到目标有序集合中,在合并的过程中以元素为单位进行合并,元素对应的分数按照不同的聚合方式和权重得到新的分数

语法:

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight
[weight ...]] [AGGREGATE <SUM | MIN | MAX>]

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

N是输入的有序集合总的元素个数,M是最终结果的有序集合的元素个数

返回值:目标集合中的元素个数

2.4 内部编码

 1)当元素个数较少且每个元素较小时,内部编码为 ziplist:

2)当元素个数超过128个,内部编码为 skiplist:

127.0.0.1:6379> ZADD key2 10 kkkkkk......

2.5 使用场景

1)添加用户赞数

例如 A 用户发布了一篇文章,获得了 3 个赞,此时就可以使用有序集合中的 ZADD 和 ZINCRBY

zadd user:ranking 3 A

后续再获得赞数,可以使用 ZINCRBY 了

zincrby user:ranking 1 A

2)取消用户赞数

如果用户注销,此时就可以把用户从榜单上删除,可以使用 ZREM

zrem user:ranking A

3) 展示用户信息以及用户分数

例如将用户的信息(姓名、年龄)保存再哈希类型中,先获取用户的 name ,再根据 name 去查用户的分数和排名

存储用户的信息

HSET user:info name A age 19

获取用户的信息

HGETALL user:info

此时就获取到了用户的 name 和 age,再根据 name 去查询用户的分数和排名

ZSCORE user:ranking A

ZRANK user:ranking A

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

QT的编译过程(底层逻辑)

qmake -project 用于从源代码生成项目文件&#xff0c;qmake 用于从项目文件生成 Makefile&#xff0c;而 make 用于根据 Makefile 构建项目。 详细解释&#xff1a; qmake -project 这个命令用于从源代码目录生成一个初始的 Qt 项目文件&#xff08;.pro 文件&#xff09;。它…

2.1 tmux和vim

文章目录 前言概述tmuxvim总结 前言 开始学习的时间是 2024.7.6 ,13&#xff1a;47 概述 最好多使用&#xff0c;练成条件反射式的 直接使用终端的工具&#xff0c;可以连接到服务器&#xff0c;不需要使用本地的软件 tmux 这个主要有两个功能&#xff0c;第一个功能是分…

SpringBoot项目练习

文章目录 SpringBootVue后台管理系统所需软件下载、安装、版本查询Vue搭建一个简单的Vue项目 Spring项目1项目架构 SpringBootVue后台管理系统 学习视频&#xff1a; https://www.bilibili.com/video/BV1U44y1W77D/?spm_id_from333.337.search-card.all.click&vd_sourcec…

2024年最新运维面试题(附答案)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 一&#xff0e;选择题 1.HTTP协议默认使用哪个端口…

【刷题汇总--大数加法、 链表相加(二)、大数乘法】

C日常刷题积累 今日刷题汇总 - day0061、大数加法1.1、题目1.2、思路1.3、程序实现 2、 链表相加(二)2.1、题目2.2、思路2.3、程序实现 3、大数乘法3.1、题目3.2、思路3.3、程序实现 4、题目链接 今日刷题汇总 - day006 1、大数加法 1.1、题目 1.2、思路 读完题,明白大数相加…

最新版情侣飞行棋dofm,已解锁高阶私密模式,单身狗务必绕道!(附深夜学习资源)

今天阿星要跟大家聊一款让阿星这个大老爷们儿面红耳赤的神奇游戏——情侣飞行棋。它的神奇之处就在于专为情侣设计&#xff0c;能让情侣之间感情迅速升温&#xff0c;但单身狗们请自觉绕道&#xff0c;不然后果自负哦&#xff01; 打开游戏&#xff0c;界面清新&#xff0c;操…

平价猫粮新选择!福派斯鲜肉猫粮,让猫咪享受美味大餐!

福派斯鲜肉猫粮&#xff0c;作为一款备受铲屎官们青睐的猫粮品牌&#xff0c;凭借其卓越的品质和高性价比&#xff0c;为众多猫主带来了健康与美味的双重享受。接下来&#xff0c;我们将从多个维度对这款猫粮进行解析&#xff0c;让各位铲屎官更加全面地了解它的魅力所在。 1️…

11.x86游戏实战-汇编指令add sub inc dec

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;10.x86游戏实战-汇编指令lea 首先双击下图红框位置 然后在下图红框位置输入0 然…

电商视角如何理解动态IP与静态IP

在电子商务的蓬勃发展中&#xff0c;网络基础设施的稳定性和安全性是至关重要的。其中&#xff0c;IP地址作为网络设备间通信的基础&#xff0c;扮演着举足轻重的角色。从电商的视角出发&#xff0c;我们可以将动态IP和静态IP比作电商平台上不同类型的店铺安排&#xff0c;以此…

记录一次MySQL恢复

一、前言 此文章由一次数据库被黑客删除而引发 由于对于Linux操作、docker使用、MySQL原理这些都相对不是很熟悉&#xff0c;所以记录下来避免以后在工作中遇到类似的问题而惊慌失措。 1.MySQL环境现状 docker管理的&#xff0c;8.0.26版本 启动语句: docker run -d -p 33…

智慧矿山建设规划方案(121页Word)

智慧矿山建设项目方案摘要 一、项目背景及现状分析 项目背景 随着信息技术的迅猛发展&#xff0c;智慧化、数字化已成为矿山行业转型升级的必然趋势。智慧矿山建设项目旨在通过集成先进的信息技术手段&#xff0c;实现对矿山生产、管理、安全等全过程的智能化监控与管理&…

【ARMv8/v9 GIC 系列 1.5 -- Enabling the distribution of interrupts】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 Enabling the distribution of interruptsGIC Distributor 中断组分发控制CPU Interface 中断组分发控制Physical LPIs 的启用Summary Enabling the distribution of interrupts 在ARM GICv3和GICv4体系结构中&#xff0c;中断分发…

如何搭建Ubuntu环境安装禅道

一、禅道安装部署的环境要求 禅道安装部署环境推荐使用 Linux Apache PHP7.0以上版本 MySQL5.5以上版本/MariaDB的组合。Nginx其次&#xff0c;不推荐IIS PHP组合。禅道需要使用PHP的这些扩展&#xff1a;pdo、pdo_mysql、json、filte、openssl、mbstring、zlib、curl、gd、…

DP:二维费用背包问题

文章目录 &#x1f3b5;二维费用背包问题&#x1f3b6;引言&#x1f3b6;问题定义&#x1f3b6;动态规划思想&#x1f3b6;状态定义和状态转移方程&#x1f3b6;初始条件和边界情况 &#x1f3b5;例题&#x1f3b6;1.一和零&#x1f3b6;2.盈利计划 &#x1f3b5;总结 &#x1…

OpenAI突然停止中国API使用,出海SaaS产品如何化挑战为机遇?

2023年是AI爆发的年代&#xff0c;人工智能带来的信息裂变刷新了整个SaaS行业。在这个AI引领的时代&#xff0c;我们不应该单纯依赖工具本身&#xff0c;而是要理解如何将这些AI功能与行业相结合。 然而&#xff0c;上周OpenAI宣布禁止对中国提供API服务&#xff0c;有一些用户…

基于Transformer神经网络的锂离子电池剩余使用寿命估计MATLAB实现【NASA电池数据集】

Transformer神经网络 基于Transformer神经网络的锂离子电池剩余使用寿命估计是一种先进的方法&#xff0c;它利用了Transformer模型在处理序列数据方面的优势。 Transformer能够有效地捕捉时间序列中的长程依赖关系和非线性模式&#xff0c;相比传统的基于循环神经网络&…

【OnlyOffice】桌面应用编辑器,插件开发大赛,等你来挑战

OnlyOffice&#xff0c;桌面应用编辑器&#xff0c;最近版本已从8.0升级到了8.1 从PDF、Word、Excel、PPT等全面进行了升级。随着AI应用持续的火热&#xff0c;OnlyOffice也在不断推出AI相关插件。 因此&#xff0c;在此给大家推荐一下OnlyOffice本次的插件开发大赛。 详细信息…

WPF中Background=“{x:Null}“ 和 Transparent

WPF中关于背景透明和背景无 此时&#xff0c;我代码中是写的有有个控件&#xff0c;一个Border &#xff0c;一个TextBox &#xff0c;范围都是全屏这么大&#xff0c;可以输入TextBox 因为&#xff0c;当border没有设置背景的时候&#xff0c;实际上是&#xff1a; <Borde…

Python的招聘数据分析与可视化管理系统-计算机毕业设计源码55218

摘要 随着互联网的迅速发展&#xff0c;招聘数据在规模和复杂性上呈现爆炸式增长&#xff0c;对数据的深入分析和有效可视化成为招聘决策和招聘管理的重要手段。本论文旨在构建一个基于Python的招聘数据分析与可视化管理系统。 该平台以主流招聘平台为数据源&#xff0c;利用Py…

实战whisper第三天:fast whisper 语音识别服务器部署,可远程访问,可商业化部署(全部代码和详细部署步骤)

Fast Whisper 是对 OpenAI 的 Whisper 模型的一个优化版本,它旨在提高音频转录和语音识别任务的速度和效率。Whisper 是一种强大的多语言和多任务语音模型,可以用于语音识别、语音翻译和语音分类等任务。 Fast Whisper 的原理 Fast Whisper 是在原始 Whisper 模型的基础上进…