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

Redis命令详解:Sorted Sets

Sorted Set(也称ZSET)和Set一样也是string类型的集合,你可以将它理解为Java中SortedSet和HashMap的集合体,一方面它是一个set,保证了元素的唯一性,另一方面它给每个value赋予了一个权重score,用来进行排序。集合中成员的最大个数为232-1个。

BZPOPMAX

最早可用版本:5.0.0

时间复杂度:O(log(N)),N是元素个数

用法:BZPOPMAX key [key ...] timeout

BZPOPMAX是ZPOPMAX的原始阻塞版。如果没有存在sorted set不能pop出元素,则连接会被阻塞。该命令会返回第一个非空的有序set的最高分的元素。

timeout参数是用来指定最大的阻塞时间,如果是0,则无限阻塞。

当没有元素被pop出,并且阻塞时间达到timeout时,返回nil。

如果有元素被pop出,则返回三个值:第一个是该元素来自哪个zset,第二个是pop元素的score,第三个是pop元素的value。

BZPOPMIN

最早可用版本:5.0.0

时间复杂度:O(log(N)),N是元素个数

用法:BZPOPMIN key [key ...] timeout

BZPOPMIN是ZPOPMIN的阻塞版本。它与BZPOPMAX相似,唯一不同的是它返回的是第一个非空有序set的最低分的元素。

ZADD

最早可用版本:1.2.0

时间复杂度:O(log(N)),N是元素个数

用法:ZADD key [NX|XX][CH][INCR]score member [score member ...]

将所有指定的成员和它的score加入zset,如果要插入的成员已经存在,则会更新该成员的分数,并将它排到正确的位置。如果key不存在,则创建一个新的zset并且插入成员。如果key存在,但不是zset类型,就会报错。score是双精度的浮点数,+inf和-inf同样有效。

在Redis3.2版本之后,ZADD命令支持了以下参数:

  • XX:只更新已有的成员,不新增
  • NX:只新增成员,不更新
  • CH:将返回值从新增成员数修改为发生变化的成员总数
  • INCR:当指定这个参数时,ZADD命令和ZINCRBY相似,但是只能接受一个成员的参数
分数的范围

Redis的Sorted Set的分数范围从-(2^53)到+(2^53)。或者说是-9007199254740992 到 9007199254740992。更大的整数在内部用指数表示。

相同分数的成员

由于所有的成员都是唯一的,当分数相同时,成员将按照字典序进行排序。它比较的是成员的字节数组,当所有成员的分数都相同时,范围查询可以用ZRANGEBYLEX命令(分数范围查询用ZRANGEBYSCORE命令)。

该命令返回值是新增成员的数量,如果是INCR参数模式,就返回新增成员的分数。

Redis2.4版本以后该命令才支持指定多个成员/分数对。

ZCARD

最早可用版本:1.2.0

时间复杂度:O(1)

当key存在时,返回zset的成员数量;否则返回0。

ZCOUNT

最早可用版本:2.0.0

时间复杂度:O(log(N)),N是zset的成员个数

用法:ZCOUNT key min max

返回分数在min到max(默认包括min和max)之间的成员个数。

ZCOUNT命令的时间复杂度为O(log(N)),因为它使用了ZRANK进行排序,然后获取范围的成员个数。

ZINCRBY

最早可用版本:1.2.0

时间复杂度:O(log(N)),N是zset的成员个数

用法:ZINCRBY key increment member

给指定zset中的指定的成员加上increment分数。如果成员不存在,则新增成员,将分数置为increment。如果key不存在,则先创建一个zset,然后加入新的成员。命令的返回值是成员的新分数。

ZINTERSTORE

最早可用版本:2.0.0

时间复杂度:O(N * K)+O(M * log(M)),N是输入的zset中的最小的成员数量,K为输入的zset的数量。M是结果中zset的成员数量

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

ZINTERSTORE命令用于计算给出的numkeys个zset的交集,并将结果保存到destination中。在给出要计算的key和其他参数之前,必须先给出numkeys。默认情况下,输出的zset成员的分数,会是输入的zset的成员的分数之和。

127.0.0.1:6379> ZADD myzset1 1 "jackey"
(integer) 1
127.0.0.1:6379> ZADD myzset1 2 "zhe"
(integer) 1
127.0.0.1:6379> ZADD myzset2 1 "jackey"
(integer) 1
127.0.0.1:6379> ZADD myzset2 2 "zhe"
(integer) 1
127.0.0.1:6379> ZADD myzset2 3 "2018"
(integer) 1
127.0.0.1:6379> ZINTERSTORE deszset 2 myzset1 myzset2
(integer) 2
127.0.0.1:6379> ZRANGE deszset 0 -1 WITHSCORES
1) "jackey"
2) "2"
3) "zhe"
4) "4"
复制代码

WEIGHTS用来对每一个zset设置一个乘数因子,在计算分数时乘以指定的数值,默认是1。

AGGREGATE参数用来指定分数的聚合策略,默认是SUM,也就是相加。还可以选择取最大或最小的分数。

如果destination已经存在,则覆盖原来的值。命令的返回值是结果的成员个数。

ZLEXCOUNT

最早可用版本:2.8.9

时间复杂度:O(log(N)),N是zset的成员个数

用法:ZLEXCOUNT key min max

当所有成员的分数都相同时,使用这个命令计算min和max之间的成员个数。

关于min和max:

  • 成员名称前需要加上[,[符号和成员名称之间不能有空格
  • 可以使用-和+表示最大值和最小值
  • 计算数量时,包括min和max
127.0.0.1:6379> ZADD myzset 0 a 0 b 0 e 0 d 0 i 0 f 0 k
(integer) 7
127.0.0.1:6379> ZLEXCOUNT myzset - +
(integer) 7
127.0.0.1:6379> ZLEXCOUNT myzset b e
(error) ERR min or max not valid string range item
127.0.0.1:6379> ZLEXCOUNT myzset [b [e
(integer) 3
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "a"
2) "b"
3) "d"
4) "e"
5) "f"
6) "i"
7) "k"
复制代码

ZPOPMAX

最早可用版本:5.0.0

时间复杂度:O(log(N)*M),N是zset的成员数量,M是弹出的成员数量

用法:ZPOPMAX key [count]

该命令用于移除并返回一定数量的分数最高的成员。count默认是1,count大于zset成员,当返回多个元素时,分数最高的最先被返回。

ZPOPMIN

最早可用版本:5.0.0

时间复杂度:O(log(N)*M),N是zset的成员数量,M是弹出的成员数量

该命令和ZPOPMAX相反,返回的是分数最低的元素。只有这点不同,其他都相同。

ZRANGE

最早可用版本:1.2.0

时间复杂度:O(log(N)+M),N是zset的成员数量,M是返回的成员数量

用法:ZRANGE key start stop [WITHSCORES]

该命令返回指定范围的成员,按照分数从低到高的顺序排。start和stop都是从0开始,也可以是负数,-1表示倒数第一个。返回的时候包括start和stop位置的成员。

如果start大于zset成员数量或者start大于stop,则返回空集合;如果stop大于最后一位,则返回start到最后一位的成员。

WITHSCORES参数表示返回的结果中是否要带分数。

ZRANGEBYLEX

最早可用版本:2.8.9

时间复杂度:O(log(N)+M),N是zset的成员数量,M是返回的成员数量

用法:ZRANGEBYLEX key min max [LIMIT offset count]

前面我们提到过,当所有的成员的分数相同时,它们会按照字典顺序排列。对于中情况,ZRANGEBYLEX命令就是用来返回指定区间成员的。指定成员时可以使用(或者[,(表示不包含指定的成员,[表示包含。

成员字符串作为二进制数组来排序,默认是ASCII字符集的顺序。

LIMIT参数用于分页,类似于SQL中的LIMIT关键字。

ZRANGEBYSCORE

最早可用版本:1.0.5

时间复杂度:O(log(N)+M),N是zset的成员数量,M是返回的成员数量

用法:ZRANGEBYSCORE key min max [WITHSCORES][LIMIT offset count]

这个命令用来返回指定分数范围的成员,包括min和max。如果分数相同,则按字典顺序排列。

LIMIT参数用来分页。

在Redis2.0以后,可用使用WITHSCORES参数,使返回值中带有分数。

我们可以使用(表示不包括指定的分数,举个栗子:

ZRANGEBYSCORE zset (1 5
复制代码

取的分数范围是1<score<=5

ZRANK

最早可用版本:2.0.0

时间复杂度:O(log(N))

该命令用于返回指定的成员从低到高的排名。返回值从0开始,第一个元素的rank是0,第二个是1……

如果成员存在,返回它的rank值;如果不存在,返回nil。

ZREM

最早可用版本:1.2.0

时间复杂度:O(M*log(N)),N是zset的成员数量,M是要删除的成员数量

从zset中删除指定的成员。返回值为实际删除的成员数量。

Redis2.4版本以后支持一次指定多个成员。

ZREMRANGEBYLEX

最早可用版本:2.8.9

时间复杂度:O(log(N)+M),N是zset的成员数量,M是要删除的成员数量

用法:ZREMRANGEBYLEX key min max

该命令用于删除指定返回的成员,最好用于所有分数都相同的集合,否则结果会不准确。

关于min和max的描述可以查看ZRANGEBYLEX命令。

ZREMRANGEBYRANK

最早可用版本:2.0.0

时间复杂度:O(log(N)+M),N是zset的成员数量,M是要删除的成员数量

用法:ZREMRANGEBYRANK key start stop

用于删除指定rank范围的成员。start和stop的介绍可以查看ZRANGE命令。

ZREMRANGEBYSCORE

最早可用版本:1.2.0

时间复杂度:O(log(N)+M),N是zset的成员数量,M是要删除的成员数量

用法:ZREMRANGEBYSCORE key min max

删除指定分数范围的成员,默认包括min和max的分数,在2.1.6版本以后可以不包括min和max,具体可以查看ZRANGEBYSCORE命令。

ZREVRANGE

最早可用版本:1.2.0

时间复杂度:O(log(N)+M),N是zset的成员数量,M是要返回的成员数量

用法:ZREVRANGE key start stop [WITHSCORES]

返回分数从高到低的成员,也就是说,顺序与ZRANGE相反。其他条件都相同。

ZREVRANGEBYLEX

最早可用版本:1.2.0

时间复杂度:O(log(N)+M),N是zset的成员数量,M是要返回的成员数量

该命令是ZRANGEBYLEX命令的倒序版本。

ZREVRANGEBYSCORE

最早可用版本:2.2.0

时间复杂度:O(log(N)+M),N是zset的成员数量,M是要返回的成员数量

是ZRANGEBYSCORE命令的倒序。

ZREVRANK

最早可用版本:2.0.0

时间复杂度:O(log(N))

是ZRANK的倒序。

ZSCAN

最早可用版本:2.8.0

时间复杂度:每次调用为O(1)

用法:ZSCAN key cursor [MATCH pattern][COUNT count]

这是一个SCAN类的命令,可以看这里进行更深入的了解。

ZSCORE

最早可用版本:1.2.0

时间复杂度:O(1)

该命令用于返回指定成员的分数。如果指定成员不存在或者key不存在,则返回nil。

ZUNIONSTORE

最早可用版本:2.0.0

时间复杂度:O(N)+O(M log(M)),N是输入的zset的大小之和,M是结果的zset的大小

用法:ZUNIONSTORE destination numkeys key [key ...][WEIGHTS weight [weight ...]][AGGREGATE SUM|MIN|MAX]

计算给出的zset的并集,并把结果存到destination,在给定要计算的key和其他参数之前,要给出numkeys,也就是key的数量。默认情况下,结果中的成员的分数,是输入的zset的该成员分数的和。

关于WEIGHTS和AGGREGATE参数,可以查看ZINTERSTORE命令中的介绍。

相关文章:

  • 开发童鞋必知必会-Linux命令
  • css清除浮动的8种方法以及优缺点
  • 5G首秀北京CBD 将在智能交通等方面打造“智慧CBD”
  • 【BZOJ1049】 [HAOI2006]数字序列
  • 推动“绿色制造” 上海发布新版产业能效指南
  • 关中海关今日揭牌开关
  • 巨头竞赛:AWS和Azure的云区块链服务有何异同?
  • docker 容器无root 权限,如何获得docker容器里面的root权限
  • 一觉睡醒,我的SC存储性能提高了54%?!
  • 【Kyligence 公开课】视频回顾—— Superset设计与SQL查询
  • 设计模式之建造者模式
  • 苹果Q1财报出炉:手机收入下滑15%,服务收入增长19%
  • 2018年全国姓名报告发布:新生儿起名用这50个字最多
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • Django 博客开发教程 16 - 统计文章阅读量
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • leetcode-27. Remove Element
  • node入门
  • October CMS - 快速入门 9 Images And Galleries
  • OSS Web直传 (文件图片)
  • React中的“虫洞”——Context
  • supervisor 永不挂掉的进程 安装以及使用
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • WePY 在小程序性能调优上做出的探究
  • 从0实现一个tiny react(三)生命周期
  • 给Prometheus造假数据的方法
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 使用API自动生成工具优化前端工作流
  • 数据可视化之 Sankey 桑基图的实现
  • 通过几道题目学习二叉搜索树
  • 微服务入门【系列视频课程】
  • 异步
  • 原生js练习题---第五课
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Hibernate主键生成策略及选择
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #{}和${}的区别?
  • #100天计划# 2013年9月29日
  • #NOIP 2014# day.1 T2 联合权值
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (0)Nginx 功能特性
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (pojstep1.1.2)2654(直叙式模拟)
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (三)终结任务
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .Net 知识杂记
  • .net反混淆脱壳工具de4dot的使用
  • ?.的用法