当前位置: 首页 > news >正文

初识redis:Zset有序集合

Set作为集合,有两个特点:唯一且无序。

Zset是有序集合,在保证唯一的情况下,是根据什么来排序的呢?排序的规则是什么?

Zset中的member引入了一个属性,分数(score),浮点类型,每个member都会安排一个分数,进行排序的时候,就是按照此处的分数大小来进行升序、降序的操作。

目录

普通命令

ZADD

ZRANGE

ZCARD

ZCOUNT

ZREVRANGE

ZRANGEBYSCORE

ZPOPMAX  ZPOPMIN

BZPOPMAX  BZPOPMAX

ZRANK   ZREVRANK

ZSCORE

ZREM

ZREMRANGEBYRANK

ZREMRANGEBYRANK

ZINCRBY

集合间操作

交集 ZINTERSTORE

并集 ZUNIONSTOR

Zset应用场景


普通命令

ZADD

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

添加元素的时候,既要添加元素又要添加分数。

不加 XX | NX  的时候,如果当前member不存在,此时就会达到“添加新member”的效果,如果当前member已经存在,此时就会更新分数。

如果元素有相同的分数可以按照元素自身字符串的字典数来排列。

Zset内部是按照升序来排列的。

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

ZRANGE

查询操作,后面加上withscores,可以查询到ZADD添加的分数。

ZCARD

获取一个Zset的基数,即Zset中的元素个数。

ZCOUNT

返回分数在某个区间的元素个数。

ZCOUNT key min max

可以遍历一遍后,就可以知道min和max,但是如果进行遍历,时间复杂度就不是O(logN)了。

实际上,Zset内部会记录每个元素当前的排行(次序),查询到元素就能知道元素所在的次序。

ZREVRANGE

ZRANGE是按照升序来排序,ZREVRANGE则是按照降序来排序。

ZRANGEBYSCORE

按照分数来找元素,通过min max来划分区间。

ZPOPMAX key [count]

ZPOPMAX  ZPOPMIN

删除并返回分数最高(低)的count个元素。

如果存在多个元素分数相同,并且同时为最大(小)值,此时删除的时候仍然只删除一个。

如果分数相同会按照membe字符串的字典序决定先后。

BZPOPMAX  BZPOPMAX

BZPOPMAX key [key ...] timeout

这个命令就是ZPOPMAX的阻塞版本,timeout表示超时时间,表示最多阻塞多久。

ZRANK   ZREVRANK

查询元素的下标(排名)。

 ZRANK得到的下标,是从前往后算的(升序)。ZREVRANK则相反,按照降序。

ZSCORE

查询指定元素的分数。时间复杂度为O(1)。

ZSCORE key member

ZREM

删除指定元素。

ZREM key member [member ...]

ZREMRANGEBYRANK

ZREMRANGEBYRANK key start stop

对于start和stop区间下标的进行元素删除。

ZREMRANGEBYRANK

ZREMRANGEBYSCORE key min max

对于min和max之间的分数,进行元素删除。

ZINCRBY

ZINCRBY key increment member

ZINCRBY命令会将有序集合中指定成员的分数增加指定的值。

如果成员不存在,它会先创建该成员,然后增加分数。

如果指定的分数增加后为负数,则分数会被设置为 0 。

集合间操作

交集 ZINTERSTORE

ZINTERSTORE 是 Redis 用于合并两个或多个有序集合的命令,并存储结果到一个新的有序集合中。

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

参数

  • destination:存储结果的有序集合的名称。
  • numkeys:参与合并的有序集合的数量。
  • key [key ...]:要合并的有序集合的名称列表。
  • WEIGHTS weight [weight ...]:(可选)每个有序集合的权重列表,用于调整每个集合成员在计算结果时的权重。
  • AGGREGATE:(可选)指定如何合并分数,可以是 SUM(默认)、MIN 或 MAX

可以看到,添加了权重的值,会取权重乘以原集合的值,再取sum添加到新的集合中去。

并集 ZUNIONSTOR

ZUNIONSTOR用法和ZINTERSTORE基本一致。

Zset应用场景

1.微博热搜

2.游戏天梯排行

3.成绩排行

对于zset,很多排行榜的场景,可以用到交集和并集,把一些成绩合并起来,并且通过动态排序来完成。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ESP RainMaker OTA 自动签名功能的安全启动
  • ssrf漏洞复现
  • 《机器学习》—— 通过下采样方法实现逻辑回归分类问题
  • 基于Java的小区物业管理系统APP的设计与实现(论文+源码)_kaic
  • Lambda 表达式的使用案例
  • openGauss之系统隐藏列
  • Vue路由—进阶篇
  • Spring Boot + MyBatis-Plus 实现 MySQL 主从复制动态数据源切换
  • 鸿蒙HarmonyOS开发:如何使用第三方库,加速应用开发
  • MAML算法详解
  • Oracle RAC 集群启动顺序
  • C语言——位运算
  • linux系统使用 docker 来部署web环境 nginx+php7.4 并配置称 docker-compose-mysql.yml 文件
  • 【第一章概述—计算机中的数制】非十进制数到十进制数的转换,八进制转十进制,16进制转十进制。十进制转8进制,十进制转16进制
  • SSRF漏洞实现
  • 07.Android之多媒体问题
  • Android交互
  • CSS实用技巧干货
  • CSS相对定位
  • Hexo+码云+git快速搭建免费的静态Blog
  • Hibernate【inverse和cascade属性】知识要点
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Linux Process Manage
  • Linux快速复制或删除大量小文件
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • mysql 数据库四种事务隔离级别
  • React 快速上手 - 07 前端路由 react-router
  • scala基础语法(二)
  • 从setTimeout-setInterval看JS线程
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 回流、重绘及其优化
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 面试遇到的一些题
  • 你真的知道 == 和 equals 的区别吗?
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 微信小程序设置上一页数据
  • 小试R空间处理新库sf
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #单片机(TB6600驱动42步进电机)
  • #微信小程序(布局、渲染层基础知识)
  • #微信小程序:微信小程序常见的配置传值
  • (06)金属布线——为半导体注入生命的连接
  • (1)svelte 教程:hello world
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (21)起落架/可伸缩相机支架
  • (3)(3.5) 遥测无线电区域条例
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (ibm)Java 语言的 XPath API
  • (安卓)跳转应用市场APP详情页的方式
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释