【Redis】 关于 Redis 有序集合类型

文章目录

  • 🍃前言
  • 🌴普通命令介绍
    • 🚩zadd
    • 🚩zcard
    • 🚩zcount
    • 🚩zrange
    • 🚩zrevrange
    • 🚩zrangebyscore
    • 🚩zpopmax
    • 🚩zpopmin
    • 🚩zrank
    • 🚩zrevrank
    • 🚩zscore
    • 🚩zrem
    • 🚩zremrangebyrank
    • 🚩zremrangebyscore
    • 🚩zincrby
  • 🎄阻塞版命令
    • 🚩bzpopmax
    • 🚩bzpopmin
  • 🎋集合间操作命令
    • 🚩zinterstore
    • 🚩zunionstore
  • 🌳内部编码
  • 🌲应用场景
  • ⭕总结

🍃前言

有序集合保留了集合不能有重复成员的特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关联,着使得有序集合中的元素是可以维护有序性的,但这个有序不是⽤下标作为排序依据⽽是⽤这个分数。

有序集合提供了获取指定分数和元素范围查找、计算成员排名等功能,合理地利⽤有序集合,可以帮助我们在实际开发中解决很多问题

需要注意的是:

  • 有序集合中的元素是不能重复的,但分数允许重复。类⽐于⼀次考试之后,每个⼈⼀定有⼀个唯⼀的分数,但分数允许相同

列表、集合、有序集合三者的异同点如下表所示:

在这里插入图片描述

🌴普通命令介绍

🚩zadd

添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double类型,+inf/-inf 作为正负极限也是合法的。

语法:

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

ZADD 的相关选项:

  • XX:仅仅⽤于更新已经存在的元素,不会添加新元素。
  • NX:仅⽤于添加新元素,不会更新已经存在的元素。
  • CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
  • INCR:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和分数

时间复杂度:

  • O(log(N))

返回值:

  • 本次添加成功的元素个数。

在这里插入图片描述

🚩zcard

获取⼀个 zset 的基数(cardinality),即 zset 中的元素个数。

语法:

zcard key

时间复杂度:

  • O(1)

返回值:

  • zset内的元素个数。

在这里插入图片描述

🚩zcount

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

语法:

zcount key min max

时间复杂度:

  • O(log(N))

返回值:

  • 满⾜条件的元素列表个数

在这里插入图片描述

🚩zrange

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

语法:

zrange key start stop [WITHSCORES]

时间复杂度:

  • O(log(N)+M)

返回值:

  • 区间内的元素列表。

在这里插入图片描述

🚩zrevrange

返回指定区间⾥的元素,分数按照降序。带上 WITHSCORES 可以把分数也返回

需要注意的是:这个命令可能在 6.2.0 之后废弃,并且功能合并到 ZRANGE 中。

语法:

zrevrange key start stop [WITHSCORES]

时间复杂度:

  • O(log(N)+M)

返回值:

  • 区间内的元素列表。
    在这里插入图片描述

🚩zrangebyscore

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

这个命令可能在 6.2.0 之后废弃,并且功能合并到 ZRANGE 中。

语法:

zrangebyscore key min max [WITHSCORES]

时间复杂度:

  • O(log(N)+M)

返回值:

  • 区间内的元素列表。
    在这里插入图片描述

🚩zpopmax

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

语法:

zpopmax key [count]

时间复杂度:

  • O(log(N) * M)

返回值:

  • 分数和元素列表

在这里插入图片描述

🚩zpopmin

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

语法:

zpopmin key [count]

时间复杂度:

  • O(log(N) * M)

返回值:

  • 分数和元素列表。

在这里插入图片描述

🚩zrank

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

语法:

zrank key member

时间复杂度:

  • O(log(N))

返回值:

  • 排名。

在这里插入图片描述

🚩zrevrank

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

zrevrank key member

时间复杂度:

  • O(log(N))

返回值:

  • 排名。

在这里插入图片描述

🚩zscore

返回指定元素的分数

语法:

zscore key member

时间复杂度:

  • O(1)

返回值:

  • 分数。

在这里插入图片描述

🚩zrem

删除指定的元素

语法:

zrem key member [member ...]

时间复杂度:

  • O(M*log(N))

返回值:

  • 本次操作删除的元素个数

在这里插入图片描述

🚩zremrangebyrank

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

语法:

zremrangebyrank key start stop

时间复杂度:

  • O(log(N)+M)

返回值:

  • 本次操作删除的元素个数

在这里插入图片描述

🚩zremrangebyscore

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

语法:

zremrangebyscore key min max

时间复杂度:

  • O(log(N)+M)

返回值:

  • 本次操作删除的元素个数。

在这里插入图片描述

🚩zincrby

为指定的元素的关联分数添加指定的分数值。

语法:

zincrby key increment member

时间复杂度:

  • O(log(N))

返回值:

  • 增加后元素的分数

在这里插入图片描述

🎄阻塞版命令

🚩bzpopmax

zpopmax 的阻塞版本

语法:

bzpopmax key [key ...] timeout

timeout的单位为秒

时间复杂度:

  • O(log(N))

返回值:

  • 元素列表。

在这里插入图片描述

🚩bzpopmin

zpopmin的阻塞版本

语法:

bzpopmin key [key ...] timeout

时间复杂度:

  • O(log(N))

返回值:

  • 元素列表。

🎋集合间操作命令

🚩zinterstore

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

语法:

zinterstore destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
  • weights 后面所表示的 weight 代表前面 key 所占有的权重
  • aggregate 表示按照什么方式进行聚合,有相加、最大值、最小值,先计算权重,后进行聚合

时间复杂度:

  • O(NK)+O(Mlog(M)), N是输⼊的有序集合中,最⼩的有序集合的元素个数; K是输⼊了⼏个有序集合;M是最终结果的有序集合的元素个数.

返回值:

  • ⽬标集合中的元素个数

在这里插入图片描述

🚩zunionstore

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

语法:

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

时间复杂度:

  • O(N)+O(M*log(M)) N 是输⼊的有序集合总的元素个数; M 是最终结果的有序集合的元素
    个数.

返回值:

  • ⽬标集合中的元素个数

在这里插入图片描述

🌳内部编码

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

  • ziplist(压缩列表):当有序集合的元素个数⼩于 zset-max-ziplist-entries 配置(默认 128 个),同时每个元素的值都⼩于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会⽤ ziplist 来作为有序集合的内部实现,ziplist 可以有效减少内存的使⽤。
  • skiplist(跳表):当 ziplist 条件不满⾜时,有序集合会使⽤ skiplist 作为内部实现,因为此时 ziplist 的操作效率会下降。

🌲应用场景

有序集合⽐较典型的使⽤场景就是排⾏榜系统。

例如常⻅的⽹站上的热榜信息,榜单的维度可能是多⽅⾯的:按照时间、按照阅读量、按照点赞量等。

⭕总结

关于《【Redis】 关于 Redis 有序集合类型》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下

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

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

相关文章

Shell脚本的分支语句,循环语句

分支语句 if 表达式 then 命令表 fi 如果表达式为真&#xff0c;则执行命令表中的命令&#xff0c;否则退出。执行fi后的语句。 给文件权限:chmod 0777 文件名 输出: ./文件名 grep 查找用户名&#xff0c;管道wc -l 统计字符 2.多路分支语句 记得给文件名权限喔&#x…

OSPF扩展知识2

FA-转发地址 正常 OSPF 区域收到的 5 类 LSA 不存在 FA 值&#xff1b; 产生 FA 的条件: 1、5类LSA ----假设 R2为 ASBR&#xff0c;90/0 口工作的 OSPF 中&#xff0c;g0/1 口工作在非 ospf 协议或不同 ospf 进程中&#xff1b;若 g0/1 也同时宣告在和 g0/0 相同的 OSPF 进程…

R语言入门 | 使用 ggplot2 进行数据可视化

1.0准备工作 先下好tidyverse包&#xff0c;并进行加载。 install.packages ( "tidyverse" ) library(tidyverse) R 包只需安装一次&#xff0c;但每次开始新会话时都要重新加载。 1.1 数据框 数据框是变量&#xff08;列&#xff09;和观测&#xff08;行&#x…

算法练习——字符串

一确定字符串是否包含唯一字符 1.1涉及知识点 c的输入输出语法 cin>>s; cout<<"NO"; 如何定义字符串 切记&#xff1a;在[]中必须加数字——字符串最大长度&#xff0c;不然编译不通过 char s[101]; 如何获取字符串长度 char s[101];cin>>s;i…

windows10远程桌面端口,修改Windows 10远程桌面端口的步骤

在Windows 10操作系统中&#xff0c;远程桌面功能为企业用户、技术支持人员以及个人用户提供了极大的便利&#xff0c;允许他们远程访问和管理另一台计算机的桌面环境。然而&#xff0c;默认的远程桌面端口&#xff08;通常为3389&#xff09;常常成为安全漏洞的潜在目标&#…

【图像处理与机器视觉】图像处理概述与像素

什么是数字图像处理 改善图像信息&#xff0c;便于作出解释 方便对图像传输&#xff0c;储存&#xff0c;方便机器理解 什么是数字图像 &#xff08;1&#xff09;模拟图像&#xff1a;连续二维函数 f&#xff08;x&#xff0c;y&#xff09;表示&#xff0c;其中 x&#xf…

操作系统真象还原:一些你可能正感到迷惑的问题

第0章-一些你可能正感到迷惑的问题 这是我看操作系统真象还原这本书的一些记录&#xff1a; 4 软件是如何访问硬件的 硬件在输入输出上大体分为串行和并行&#xff0c;相应的接口也就是串行接口和并行接口。串行硬件通过串行接口与 CPU 通信&#xff0c;反过来也是&#xff…

【uni-app】Pinia 持久化

小程序端 Pinia 持久化 说明&#xff1a;Pinia 用法与 Vue3 项目完全一致&#xff0c;uni-app 项目仅需解决持久化插件兼容性问题。 持久化存储插件 安装持久化存储插件&#xff1a; pinia-plugin-persistedstate pnpm i pinia-plugin-persistedstate插件默认使用 localStor…

MySQL——JDBC编程

目录 前言 一、JDBC概述 二、准备工作 1.下载MySQL的JDBC驱动包 2.把jar引入到项目中 三、JDBC编程 1.插入操作 2.查询操作 尾声 前言 本篇文章主要介绍如何利用Java代码进行操作数据库&#xff0c;在实际开发中&#xff0c;绝大多数对数据库的操作我们都是通过代码进行…

uni-app全局弹窗的实现方案

背景 为了解决uni-app 任意位置出现弹窗 解决方案 一、最初方案 受限于uni-app 调用组件需要每个页面都引入注册才可以使用&#xff0c;此方案繁琐&#xff0c;每个页面都要写侵入性比较强 二、改进方案 app端&#xff1a;新建一个页面进行跳转&#xff0c;可以实现伪弹窗…

筛选的艺术:数组元素的精确提取

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、筛选的基本概念 二、筛选的实际应用案例 1. 筛选能被三整除的元素 2. 筛选小于特定值…

C++ list类

目录 0.前言 1.list介绍 1.1优势 1.2劣势 1.3容器属性 2.list使用 2.1构造函数 2.1.1默认构造函数 2.1.2填充构造函数 2.1.3范围构造函数 2.1.4拷贝构造函数 2.1.5初始化列表构造函数 2.2迭代器 2.2.1 begin() 2.2.2 end() 2.2.3 cbegin() 2.2.4 cend() 2.2.…

PyMySQL连接池

背景 在用python写后端服务时候&#xff0c;需要与mysql数据库进行一些数据查询或者插入更新等操作。启动服务后接口运行一切正常&#xff0c; 隔了第二天去看服务日志就会报错&#xff0c;问题如下&#xff1a; pymysql.err.OperationalError: (2006, "MySQL server ha…

JavaScript-内存分配

内存空间 内存分为栈和堆 栈&#xff1a;由操作系统自动释放存放的变量值和函数值等。简单数据类型存放在栈中 栈会由低到高先入后出 堆&#xff1a;存储引用类型 &#xff08;对象&#xff09; 对象会先将数据存放在堆里面&#xff0c;堆的地址放在栈里面

数字孪生智慧车站:全方位可视化管理平台

运用图扑数字孪生技术&#xff0c;智慧车站可视化管理平台实时模拟并监控车站运行状态&#xff0c;通过整合即时数据与历史数据&#xff0c;提供精准分析和预测。该平台支持乘客流量管理、设备运行监控、安全预警等多项功能&#xff0c;提高车站运营效率与安全性。直观的可视化…

这个橙子真的香!老司机徒手把玩香橙派Kunpeng Pro事后回忆录

说&#xff01;你是哪个门派&#xff1f; 香橙&#xff0c;芸香科柑橘属小乔木。枝通常有粗长刺&#xff0c;新梢及嫩叶柄常被疏短毛。叶厚纸质&#xff0c;翼叶倒卵状椭圆形&#xff0c;顶部圆或钝。。。 咦&#xff1f;小李&#xff1f;我们不是搞IT的嘛&#xff0c;怎么会有…

(函数)求一元二次方程的根(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>//声明函数&#xff1b; //判断条件等于0时&#xff1b; void zeor(double a, double b);//判断条件大于0时&#xff1b; void bigzeo…

浅谈 parallelStream和Stream 源码及其应用场景

上篇讲述了list.forEach()和list.stream().forEach() 异同点 谈到了并行流的概念&#xff0c;本篇则从源码出发&#xff0c;了解一下其原理。 一、流的初始操作流程 jdk8中 将Collection中加入了转换流的概念。 default Stream<E> stream() {return StreamSupport.str…

第十三章 进程与线程

第十三章 进程与线程 程序与进程的概念 程序&#xff1a; 英文单词为Program&#xff0c;是指一系列有序指令的集合&#xff0c;使用编程语言所编写&#xff0c;用于实现一定的功能。 进程&#xff1a; 进程则是指启动后的程序&#xff0c;系统会为进程分配内存空间。 函数式…

【PingPong_注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …