Redis-带你深入学习数据类型zset

news2024/11/29 1:33:27

目录

1、zset有序集合

2、zset相关命令

2.1、添加或更新指定的元素——zadd

2.2、获取有序集合zset的元素个数相关命令:zcard、zcount

2.3、返回指定区间元素相关命令:zrange、arevrange、zrangebyscore

2.4、删除相关命令:zpopmax、zpopmin、bzpopmax、bzpopmin、zrem、zremrangebyrank、zremrangebyscore

2.5、返回指定元素的排名——zrank、zrevrank

2.6、返回指定元素的分数——zscore

2.7、为指定的元素的关联分数添加指定的分数值——zincrby

2.8、集合间操作:zinterstore、zunionstore

3、应用场景


1、zset有序集合

         zset中使用的是member和score【score为一个浮点数】,而不是键值对key value;

score member和key vlaue的区别;score有两个特殊取值:inf 无穷大 ,-inf无穷小 ---二者的绝对值都是无限大的~

  • member score:既可以通过member找score,也可以通过score找member
  • key value:只能通过key来找对应的value

zset的特点:

  • 有序的---按照分数升序排列,分数score相同的按照member的字典序排列
  • member值需要唯一,score可以不唯一

2、zset相关命令

2.1、添加或更新指定的元素——zadd

  • zadd:添加或更新指定的元素以及关联的分数到zset中
  • 语法:zadd key [ NX | XX ] [ CH ] [ INCR ] score member [score member...]
  • 参数说明1:[NX |XX]:不添加此参数时,默认为如果member存在,则更新score值,如不存在,则会添加member;NX:如果member存在则直接返回,不存在则新增member;XX:如果member存在则更新score,不存在则直接返回
  • 参数说明2:CH:修改返回值,默认返回值为新增member的个数,添加该参数后,返回值为新增member的个数加上score被修改的个数
  • 参数说明3:INCR:给指定的某一个score加上指定的值,注意:该参数一次只能操作一个member;使用该参数时,返回被修改为:返回的是给定的score加上指定值后,新的score的值
  • 参数说明4:[score member...]--->支持一次添加或指定更新多个member
  • 参数补充:更新版本的Redis,添加了一个参数:[LT | GT]。默认是若member存在,则修改score;LT:less than--member存在时,更新score,只有当给定的新的分数小于原来的分数才能修改成功;greater than--member存在时,更新score,只有当给定的新的分数大于原来的分数才能修改成功
  • 返回值:默认为新增成功的元素个数,特殊情况在上述的参数说明已经提及了~
  • 时间复杂度:logN--zset内部数据结构主要是跳表,每次新增或修改后,内部都会进行再次排序,保证zset内部一直是有序的,具体怎么推导出时间复杂度是logN,后续文章会持续更新的~

举例:

2.2、获取有序集合zset的元素个数相关命令:zcard、zcount

zcard:获取一个zset的基数,也就是zset中某个key的元素个数

  • 语法:zcard key
  • 返回值:zset中某key中的元素个数
  • 时间复杂度O(1)

举例:

zount:获取指定分数区间内的元素个数

  • 语法:zount key min max
  • 参数说明:min和max都是默认包含的,不想包含的话,需要在min或max左边加上左括号(
  • 返回值:指定区间的元素个数
  • 时间复杂度O(logN)----根据min找到对应的元素,再根据max找到对应的元素,查询到元素后就可以获取到他的次序,也就是下标,直接对应下标相减即可~

举例:

2.3、返回指定区间元素相关命令:zrange、zrevrange、zrangebyscore

zrange:返回指定区间内的元素,按分数升序排列

  • 语法:zrange key start stop [withscores]
  • 参数说明:默认返回member值,加上该参数后,会带着分数一起返回;start sotp支持负数
  • 返回值:区间内元素的列表
  • 时间复杂度O(log(N)+M)----logN:根据start找到对应元素;M:start-stop区间的元素个数

举例:

zrevrange:返回指定区间内的元素,按照分数降序排列---注意这里的按照降序是,将原本的整个zset先进行降序排列,具体下标也会随之变化,例如原本ll是在下标为len-1的地方,降序调整后,ll是在下标为0的地方~

  • 语法:zrevrange key start stop [withscores]
  • 返回值:区间内的元素列表
  • 时间复杂度:O(log(N)+M)----logN:根据start找到对应元素;M:start-stop区间的元素个数

举例:

zrangebyscore:返回某分数段之间的元素

  • 语法:zrangescore key min max [withscores] 
  • 参数说明1:默认为闭区间,使用 ( 可以调整为开区间
  • 返回值:区间内的元素列表
  • 时间复杂度O(log(N)+M)----logN:根据start找到对应元素;M:start-stop区间的元素个数
  • 该命令在6.2.0之后的版本中废弃了,功能合并至zrang命令中

举例:

2.4、删除相关命令:zpopmax、zpopmin、bzpopmax、bzpopmin、zrem、zremrangebyrank、zremrangebyscore

zpopmax:删除并返回分数最高的count个元素,默认为1

  • 语法:zpopmax key [count]
  • 返回值:分数和元素列表
  • 时间复杂度:O(log(N)*M)----N指的是集合中元素个数;M指的是count  

举例;

zpopmin:删除并返回分数最低的count个元素,默认为1

  • 语法:zpopmin key [count]
  • 返回值:分数和元素列表
  • 时间复杂度:O(log(N)*M)----N指的是集合中元素个数;M指的是count  

举例:

bzpopmax:zpopmax阻塞版本

  • 语法:bzpopmax key [key...] timeout
  • 返回值:分数和元素列表
  • 时间复杂度:O(log(N)*M)----N指的是集合中元素个数;M指的是count  
  • 该命令阻塞时,redis依旧可以处理其他命令

bzpopmin:zpopmin阻塞版本

  • 语法:bzpopmin key [key...] timeout
  • 返回值:分数和元素列表
  • 时间复杂度:O(log(N)*M)----N指的是集合中元素个数;M指的是count  
  • 该命令阻塞时,redis依旧可以处理其他命令

zrem:删除指定元素

  • 语法:zrem key member [member...]
  • 返回值:成功删除的元素个数
  • 时间复杂度:O(M*log(N))-----N:整个集合中元素个数;M:member的个数

举例;

zremrangebyrank:按照升序,删除指定范围的元素

  • 语法:zremrangebyrank key start stop
  • 返回值:成功删除的元素个数
  • 时间复杂度:O(log(N)+M)

举例:

zremrangebyscore:按照分数删除指定区间范围的元素

  • 语法:zremrangebyscore key min max
  • 返回值:成功删除的元素个数
  • 时间复杂度:O(log(N)+M)

举例:

2.5、返回指定元素的排名——zrank、zrevrank

zrank:返回指定元素的排名-升序

  • 语法:zrank key member
  • 返回值:该member的排名
  • 时间复杂度:O(logN)

举例:

zrevrank:返回指定元素的排名-降序【集合以降序排列,指定元素的排名】

  • 语法:zrevrank key member
  • 返回值:排名
  • 时间复杂度:O(logN)

举例:

2.6、返回指定元素的分数——zscore

  • zscore:返回指定元素的分数
  • 语法:zscore key member
  • 返回值:分数
  • 时间复杂度:O(1)----这里也是要进行查询操作,为什么时间复杂度不是O(logN)呢?因为redis中对于这样的查询操作做了特殊优化,付出了额外的空间代价~

举例:

2.7、为指定的元素的关联分数添加指定的分数值——zincrby

  • 语法:zincrby key incrment member
  • 返回值:增加后元素的分数
  • 时间复杂度:O(logN)

举例:

2.8、集合间操作:zinterstore、zunionstore

zinterstore:几个集合的交集,并将结果保存到另一个key中

  • 语法:zinterstore destination numkeys key [key...] [WEIGHTS weight] [AGGREATE sum | min | max]
  • 参数说明1:destination指的是交集结果存入到的目标key
  • 参数说明2:numkeys指的是个数,后面有多少个key的个数。因为后面可能还有会其它参数,为了将key值与其他的参数做区分~
  • 参数说明3:weights-->指的是指定每个key所占的权重,看下图举例中的最后一个命令,weights后面跟了一个 1 和 4,意思就是给前面对应位置的key1乘1,对应的key2乘4~【在应用场景排行榜中,例如总综测成绩排名可能涉及到成绩,和课外活动,而成绩占比百分之七十,课外活动占三十,就可以使用这个命令来解决此类问题】
  • 参数说明4:AGGREATE-->解决的是在取交集时,number相同而score不同时,应当以谁为准,sum指score相加,min取最大小的score,max取最大的score【默认取sum】
  • 返回值:目标集合中的元素个数
  • 时间复杂度:O(N*K)+O(M*log(M))----N:输入的有序集合中,最小的集合的元素个数;K:输入了几个有序集合;M:最终结果的有序集合的元素个数

举例:

zunionstore:几个集合的并集,并将结果保存到另一个key中

  • 语法:zunionstore destination numkeys key [key...] [WEIGHTS weight] [AGGREATE sum | min | max]
  • 参数说明:同上zinterstore~
  • 返回值:目标集合中的元素个数
  • 时间复杂度:O(N)+O(M*log(M))----N:输入的有序集合中,最小的集合的元素个数;K:输入了几个有序集合;M:最终结果的有序集合的元素个数  【上一个命令zinterstore命令的时间复杂度,k一般不会太大,可看为1,这样看两个命令的时间复杂度就是一样的了~】

举例:


3、应用场景

        排行榜——使用redis的zset实现排行榜,能够实时的保证排行榜的更新~

好啦,下期见咯~

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

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

相关文章

C# 模拟button按钮批量锁住与打开

项目需求: 当winform界面上存在多个按钮时(大于2个),用户需求为当点击其中一个按钮后,其它按钮全部为禁用,当被点击的按钮后台逻辑执行完成后,再释放所有按钮。用户可再次点击其它按钮。 此案…

Eclipse官网下载历史版本

进入官网 https://www.eclipse.org/ 进入下载页面 选择下载包 同一版本,又有不同类型 Eclipse IDE for Enterprise Java and Web Developers Eclipse IDE for Java Developers 任何Java开发人员必备的工具,包括Java IDE、Git客户端、XML编辑器、Mave…

第33章_瑞萨MCU零基础入门系列教程之DHT11温湿度获取实验

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…

数据采集:数据挖掘的基础

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…

解决gyp verb `which` failed python2 Error: not found: python2

运行老项目遇到如下报错 PS C:\Users\demo02> yarn install yarn install v1.22.19 info No lockfile found. [1/5] Validating package.json... [2/5] Resolving packages... warning axios0.18.1: Critical security vulnerability fixed in v0.21.1. For more informati…

4.1.8- Web 应用程序使用的组件进行指纹识别

Web 应用程序使用的组件进行指纹识别 IDWSTG-INFO-08 总结 毫不夸张地说,几乎所有可以想象的Web应用程序的想法都已经投入开发。随着全球大量自由和开源软件项目的积极开发和部署,应用程序安全测试很可能会遇到完全或部分依赖于这些知名应用程序或框架…

vue cli npm run build打生产环境包报错Cannot read property ‘pop‘ of undefined

问题出在webpack配置的代码拆分splitChunks 解决办法:每个cacheGroups中配置enforce: true;

数据结构——排序算法——快速排序

快速排序算法的基本思想是 1.从数组中取出一个数,称之为基数(pivot) 2.遍历数组,将比基数大的数字放到它的右边,比基数小的数字放到它的左边。遍历完成后,数组被分成了左右两个区域 3.将左右两个区域视为两…

巧用Lambda表达式获取对象属性名告别魔法值

在我们日常开发中,使用 MyBatis-Plus 写 SQL 执行的时候,难免会用到表字段,虽然 MyBatis-Plus 提供了 LambdaQueryWrapper 帮助我们使用 Lambda 方式调用对象属性名,但有的时候还是不免用到魔法值,当对象的属性名更改了…

检索技术核心学习总结

一、学习检索技术的必要性分析 (一)关键原因分析 学习检索技术(Information Retrieval,IR)具有多种重要的原因,特别是在今天信息爆炸的数字化时代。 总的来说,学习检索技术有助于提高信息处理…

基于Python和mysql开发的商城购物管理系统分为前后端(源码+数据库+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python和mysql开发的商城购物管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含:项目源码、项目文档、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过…

Elasticsearch:什么是生成式人工智能?

生成式人工智能定义 给学生的解释(基本): 生成式人工智能是一种可以创造新的原创内容的技术,例如艺术、音乐、软件代码和写作。 当用户输入提示时,人工智能会根据从互联网上现有示例中学到的知识生成响应,…

记一次线上BUG排查过程

1. 线上遇到一个非常奇怪的bug,为一个用户分配业务线类型后,该用户登录时,提示502,但其它的用户登录完全是正常的 2. 问题现象 3. 排查思路 先去看线上日志,看是否有error,但日志里边这个接口200正常返回…

业务中如何拓展微前端架构

站在整体架构的角度,微前端可以分为以下几类拓展迭代方向。 注册更多微应用 随着业务的扩展,我们可以在主应用中注册更多的微应用。每个微应用是一个独立的子系统,只需要在主应用的注册列表中添加新的项,配置微应用的名称、入口、活动规则等信息即可。 集成微应用…

【element-ui】el-date-picker 之picker-options时间选择区间禁用效果的实现

element-ui 时间选择器的时间区间禁用dom层引入:picker-option <el-date-pickerv-model"searchFormObj.workTime"clearablevalue-formate"yyyy-MM-dd":picker-options"pickerOptions"placeholder"请选择时间" ></el-date-pi…

应用在儿童平板防蓝光中的LED防蓝光灯珠

现在电子产品多&#xff0c;手机、平板电脑、电子书等等&#xff0c;由于蓝光有害眼睛健康&#xff0c;于是市场上有很多防蓝光的眼镜、防蓝光的手机膜、防蓝光的平板&#xff0c;这些材料和设备到底有没有用&#xff1f;如何正确预防蓝光危害呢&#xff1f; 我们现在所用的灯…

借助工业PoE交换机实现智慧停车场管理

停车场是现代城市的重要基础设施&#xff0c;而且随着汽车保有量的持续增长&#xff0c;城市中也出现了数百甚至上千停车位的大型、超大型停车场&#xff0c;而这些大型停车场的管理和服务也是一个难题。 针对大型停车场的管理&#xff0c;可以借助工业PoE交换机&#xff0c;快…

postman和node.js的使用、YApi 新版如何查看 http 请求数据

一 nodejs下载 下载链接&#xff1a; nodejs官网&#xff1a; https://nodejs.org/zh-cn/download 我使用的windows .msi安装方式&#xff0c;双击一直下一步就行 当前安装完成后的版本&#xff1a;1.下载 2.安装步骤 下载完成后&#xff0c;双击安装包&#xff0c;开始安装&…

LoGoNet:基于局部到全局跨模态融合的精确 3D 目标检测

论文地址&#xff1a;https://arxiv.org/abs/2303.03595 论文代码&#xff1a;https://github.com/sankin97/LoGoNet 论文背景 激光雷达传感器点云通常是稀疏的&#xff0c;无法提供足够的上下文来区分远处的区域&#xff0c;从而造成性能次优。 激光雷达-摄像机融合方法在三…

html网页制作期末大作业-网上花店商城html+css+javascript

一、简介 html网页制作期末大作业-网上花店商城htmlcssjavascript 8个页面适用学生作业 课程设计花店、期末作业花店、毕业设计花店 ​ 二、部分网页截图 三、部分网页源码 1. 首页代码 <!DOCTYPE html> <html lang"en"> <head><meta charse…