redis学习-17- Redis zset有序集合操作

13.zset有序集合

  • Redis zset(有序集合)最具特色的数据类型之一,首先它是一个 set,其中的成员是有序排列的,这保证了内部 value 值的唯一性,它和 set 集合的相同之处在于,集合中的每一个成员都是字符串类型,并且不允许重复;而它们最大区别是,有序集合是有序的,set 是无序的,这是因为有序集合中每个成员都会关联一个 double(双精度浮点数)类型的 score (分数值),Redis 正是通过 score 实现了对集合成员的排序。zset的成员是唯一的,但分数(score)却可以重复

  • zset 是 Redis 常用数据类型之一,它适用于排行榜类型的业务场景,比如 热词指数榜单中,我们可以将词汇的搜索次数作为 score 值,把词汇的名字作为 value 值,通过对 score 排序就可以得出搜索的“热词指数榜单”。

  • 使用以下命令创建一个有序集合:

127.0.0.1:6379> ZADD key score member [score member ...] 
#参数解释:
key:指定一个键名;
score:分数值,用来描述  member,它是实现排序的关键;
member:要添加的成员(元素)。
  • 当 key 不存在时,将会创建一个新的有序集合,并把分数/成员(score/member)添加到有序集合中;当 key 存在时,但 key 并非 zset 类型,此时就不能完成添加成员的操作,同时会返回一个错误提示。

注意:在有序集合中,成员是唯一存在的,但是分数(score)却可以重复。有序集合的最大的成员数为 2^32 - 1 (大约 40 多亿个)。

使用场景:

  • 排序:存储班级成绩、工资表排序
  • 带权重判断:普通消息-1,重要消息-2
  • 排行榜
13.1 有序集合
  • 有序集合(zset)同样使用了两种不同的存储结构,分别是 zipList(压缩列表)和skipList(跳跃列表),当 zset 满足以下条件时使用压缩列表:

    • 成员的数量小于128 个;
    • 每个 member (成员)的字符串长度都小于 64 个字节。
  • 压缩列表:对压缩列表做简单介绍,它由以下五部分组成,如图所示:在这里插入图片描述

  • 上述每一部分在内存中都是紧密相邻的,并承担着不同的作用,介绍如下:

    • zlbytes 是一个无符号整数,表示当前 ziplist 占用的总字节数;
    • zltail 指的是压缩列表尾部元素相对于压缩列表起始元素的偏移量。
    • zllen 指 ziplist 中 entry 的数量。当 zllen 比2^16 - 2大时,需要完全遍历 entry 列表来获取 entry 的总数目。
    • entry 用来存放具体的数据项(score和member),长度不定,可以是字节数组或整数,entry 会根据成员的数量自动扩容。
    • zlend 是一个单字节的特殊值,等于 255,起到标识 ziplist 内存结束点的作用。
  • 下面执行ZADD命令添加两个成员:java 的热词指数是 70;python 的热词指数是 90。
    在这里插入图片描述

  • 当 zset 使用压缩列表保存数据时,entry 的第一个节点保存 member,第二个节点保存 score。依次类推,集合中的所有成员最终会按照 score 从小到大排列。

  • 跳跃列表:当有序结合不满足使用压缩列表的条件时,就会使用 skipList 结构来存储数据。跳跃列表(skipList)又称“跳表”是一种基于链表实现的随机化数据结构,其插入、删除、查找的时间复杂度均为 O(logN)。从名字可以看出“跳跃列表”,并不同于一般的普通链表,它的结构较为复杂。

  • 在 Redis 中一个 skipList 节点最高可以达到 64 层,一个“跳表”中最多可以存储 2^64 个元素,每个节点都是一个 skiplistNode(跳表节点)。skipList 的结构体定义如下:

typedf struct zskiplist{
    //头节点
    struct zskiplistNode *header;
    //尾节点
    struct zskiplistNode *tail;
    // 跳表中的元素个数
    unsigned long length;
    //表内节点的最大层数
    int level;
}zskiplist;
  • 参数说明:

    • header:指向 skiplist 的头节点指针,通过它可以直接找到跳表的头节点,时间复杂度为 O(1);
    • tail:指向 skiplist 的尾节点指针,通过它可以直接找到跳表的尾节点,时间复杂度为 O(1);
    • length:记录 skiplist 的长度,也就跳表中有多少个元素,但不包括头节点;
    • level:记录当前跳表内所有节点中的最大层数(level);
  • 跳跃列表的每一层都是一个有序的链表,链表中每个节点都包含两个指针,一个指向同一层的下了一个节点,另一个指向下一层的同一个节点。最低层的链表将包含 zset 中的所有元素。如果说一个元素出现在了某一层,那么低于该层的所有层都将包含这个元素,也就说高层是底层的子集。

  • 通过以下示意图进一步认识 skiplist 结构。下图是一个上下共四层的跳跃列表结构:
    在这里插入图片描述

  • 跳跃列表中的每个节点都存储着 S:V(即 score/value),示意图显示了使用跳跃列表查找 S:V 节点的过程。跳跃列表的层数由高到低依次排列,最低层是 L0 层,最高层是 L3 层,共有 4 层。

  • 上图首先从最高层开始遍历找到第一个S:V节点,然后从此节点开始,逐层下降,通过遍历的方式找出每一层的 S:V 节点,直至降至最底层(L0)才停止。在这个过程中找到所有 S:V 节点被称为期望的节点。跳跃列表把上述搜索一系列期望节点的过程称为“搜索路径”,这个“搜索路径”由搜索到的每一层的期望节点组成,其本质是一个列表。

13.2 常用命令汇总
命令说明
ZADD key score1 member1 [score2 member2]用于将一个或多个成员添加到有序集合中,或者更新已存在成员的 score 值
ZCARD key获取有序集合中成员的数量
ZCOUNT key min max用于统计有序集合中指定 score 值范围内的元素个数。
ZINCRBY key increment member用于增加有序集合中成员的分值。
ZINTERSTORE destination numkeys key [key …]求两个或者多个有序集合的交集,并将所得结果存储在新的 key 中。
ZLEXCOUNT key min max当成员分数相同时,计算有序集合中在指定词典范围内的成员的数量。
ZRANGE key start stop [WITHSCORES]返回有序集合中指定索引区间内的成员数量。
ZRANGEBYLEX key min max [LIMIT offset count]返回有序集中指定字典区间内的成员数量。
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]返回有序集合中指定分数区间内的成员。Limit 做用是返回限制 limit 开始下标步 多少步
ZRANK key member返回有序集合中指定成员的排名或下标位置。
ZREM key member [member …]移除有序集合中的一个或多个成员。
ZREMRANGEBYLEX key min max移除有序集合中指定字典区间的所有成员。
ZREMRANGEBYRANK key start stop移除有序集合中指定排名区间内的所有成员。
ZREMRANGEBYSCORE key min max移除有序集合中指定分数区间内的所有成员。
ZREVRANGE key start stop [WITHSCORES]返回有序集中指定区间内的成员,通过索引,分数从高到低。
ZREVRANGEBYSCORE key max min [WITHSCORES]返回有序集中指定分数区间内的成员,分数从高到低排序。
ZREVRANK key member返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序。
ZSCORE key member返回有序集中,指定成员的分数值。
ZUNIONSTORE destination numkeys key [key …]求两个或多个有序集合的并集,并将返回结果存储在新的 key 中。
ZSCAN key cursor [MATCH pattern] [COUNT count]迭代有序集合中的元素(包括元素成员和元素分值)。
13.3 ZADD、ZRANGE命令
  • ZADD 命令将一个或多个 member 元素及其 score 值加入到有序集 key 当中。如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。命令可用版本:>= 1.2.0

注意:在 Redis 2.4 版本以前,ZADD 每次只能添加一个元素。

  • ZRANGE 命令返回有序集合 key 中,指定区间内的成员,其中成员的位置按 score 值递增(从小到大)来排序。如果需要成员按 score 值递减(从大到小)来排列,请使用 ZREVRANGE 命令。对于具有相同 score 值的成员按字典序来排列。通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回。命令可用版本:>= 1.2.0。

  • 命令的基本语法如下:

ZADD 命令的基本语法如下:
ZADD key [NX|XX] [CH] [INCR] score member [score member ...] 
# ZRANGE 命令的基本语法如下:
ZRANGE key start stop [WITHSCORES] 
  • ZADD 命令的返回值:被成功添加的新成员的数量,不包括那些被更新的,或者已经存在的成员。

  • ZRANGE 命令的返回值:指定区间内,带有 score 值(可选)的有序集成员的列表。

  • 命令演示

#创建有序集合
remote:0>zadd height 180 zs 190 tony 185 ls
"3"
#创建无序集合
remote:0>sadd course c++ c# .net java php
"3"
#如果key类型不是有序集合,则添加失败
remote:0>zadd course 20 python
"WRONGTYPE Operation against a key holding the wrong kind of value"

remote:0>zrange height 0 3 
 1)  "zs"
 2)  "ls"
 3)  "tony"
remote:0>zrange height 0 3 withscores
 1)  "zs"
 2)  "180"
 3)  "ls"
 4)  "185"
 5)  "tony"
 6)  "190"
#查询zset中所有的数据
remote:0>zrange height 0 -1 withscores
 1)  "zs"
 2)  "180"
 3)  "ls"
 4)  "185"
 5)  "tony"
 6)  "190"
13.4 ZCARD命令
  • ZCARD 命令返回有序集 key 的基数。命令可用版本:>= 1.2.0。ZCARD 命令的基本语法如下:
ZCARD key
  • ZCARD 命令的返回值:当 key 存在且是有序集类型时,返回有序集的基数。当 key 不存在时,返回 0 。命令演示:
#创建有序集合
remote:0>zadd height 180 zs 190 tony 185 ls
"3"
remote:0>zrange height 0 8 withscores
 1)  "zs"
 2)  "180"
 3)  "ls"
 4)  "185"
 5)  "tony"
 6)  "190"
#有序集合的基数
remote:0>zcard height
"3"
#key不存在时,返回 0
remote:0>zcard heights
"0"
13.5 ZCOUNT命令
  • ZCOUNT 命令返回有序集 key 中,score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。命令可用版本:>= 2.0.0。ZCOUNT 命令的基本语法如下:
ZCOUNT key min max
参数说明
min集合中排序位置较小的成员,可以 ”(“ 开头,或直接以数值表示
max集合中排序位置较大的成员,可以 ”(“ 开头,或直接以数值表示
  • ZCOUNT 命令的返回值:score 值在 min 和 max 之间的成员的数量。命令演示
#创建有序集合
remote:0>zadd height 180 zs 190 tony 185 ls
"3"
remote:0>zrange height 0 8 withscores
 1)  "zs"
 2)  "180"
 3)  "ls"
 4)  "185"
 5)  "tony"
 6)  "190"
#统计分值区间内的成员数量180<=score<=186
remote:0>zcount height 180 186
"2"
#统计指定身高范围内的元素个数170<score<190
remote:0>zcount height (170  (190 
"2"
#查看有序集合在指定字典区间内的成员的数
#命令中包含 LEX 才能用 - 表示最小值,而 + 则表示最大值
remote:0>zlexcount height - +
"3"
13.6 ZINCRBY命令
  • ZINCRBY 命令为有序集合 key 的成员 member 的 score 值加上增量 increment。当 key 不存在,或 member 不是 key 的成员时,ZINCRBY key increment member 等同于 ZADD key increment member;当 key 不是有序集类型时,返回一个错误。

  • 也可以通过传递一个负数值 increment ,让 score 减去相应的值。score 值可以是整数值或双精度浮点数。命令可用版本:>= 1.2.0

  • ZINCRBY 命令的基本语法如下:

ZINCRBY key increment member  
  • ZINCRBY 命令的返回值:member 成员的新 score 值,以字符串形式表示。命令演示
#创建有序集合
remote:0>zadd height 180 zs 190 tony 185 ls
"3"
remote:0>zrange height 0 8 withscores
 1)  "zs"
 2)  "180"
 3)  "ls"
 4)  "185"
 5)  "tony"
 6)  "190"
  #减去相应的分值
 remote:0>zincrby height -10 zs
"170"
 #给定的成员增加相应的分值
 remote:0>zincrby height 20 tony
"210"
13.7 ZINTERSTORE命令
  • ZINTERSTORE 命令用于计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。默认情况下,结果集中某个成员的分数值是所有给定集合中该成员的分数值之和。

  • ZINTERSTORE 命令的基本语法如下:

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] 
  • WEIGHTS:WEIGHTS 选项用来给每个有序集合分别指定一个加权因子,每个有序集合中所有成员的 score 值在传递给聚合函数(aggregation function)之前,都要先乘以该加权因子。如果没有指定 WEIGHTS 选项,加权因子默认设置为 1 。

  • AGGREGATE:使用 AGGREGATE 选项,可以指定并集的结果集的聚合方式。默认使用的参数 SUM ,可以将所有集合中某个成员的 score 值之和作为结果集中该成员的 score 值;若使用 MIN 参数,则将所有集合中某个成员的最小 score 值作为结果集中该成员的 score 值;而参数 MAX 则是将所有集合中某个成员的最大 score 值作为结果集中该成员的 score 值。

  • ZINTERSTORE 命令的返回值:保存到 destination 的结果集的基数。命令演示

#创建有序集合
remote:0>zadd height 160 zs 210 tony 185 ls
"3"
remote:0>zadd weight 180 ww 190 zs 185 ls 210 ha 185 qs 190 zl
"0"
#求两个集合value的交集,以两个集合中相同元素的最小score作为交集元素的score
remote:0>zinterstore value 2 height weight aggregate min
"2"
remote:0>zrange value 0 -1 withscores
 1)  "zs"
 2)  "160"
 3)  "ls"
 4)  "185"
13.8 ZRANGEBYLEX命令
  • ZRANGEBYLEX 命令返回有序集合 key 中指定区间内的成员。此命令适用于分数相同的有序集合。注意:若命令中包含 LEX 则要求有序集合成员的分数值 score 必须相同。命令可用版本:>= 2.8.9

  • ZRANGEBYLEX 命令的基本语法如下:

ZRANGEBYLEX key min max [LIMIT offset count]
  • 参数说明如下:
参数说明
min集合中排序位置较小的成员,可使用 ”-“ 代替,或直接以数值表示
max集合中排序位置较大的成员,可使用 ”+”代替,或直接以数值表示。
LIMIT返回结果是否分页,指令中包含 LIMIT 后 offset、count 必须输入。
offset偏移量,返回结果的起始位置。
count返回结果数量。
  • ZRANGEBYLEX 命令的返回值:指定成员范围的元素列表。命令演示:
#创建有序集合
remote:0>zadd height 160 zs 210 tony 185 ls
"3"
remote:0>zadd height 165 ll 170 hh 180 lz 190 yz
"4"
remote:0>zrange height 0 9 withscores
 1)  "zs"
 2)  "160"
 3)  "ll"
 4)  "165"
 5)  "hh"
 6)  "170"
 7)  "lz"
 8)  "180"
 9)  "ls"
 10)  "185"
 11)  "yz"
 12)  "190"
 13)  "tony"
 14)  "210
remote:0>zrangebylex height - +
 1)  "zs"
 2)  "ll"
 3)  "hh"
 4)  "lz"
 5)  "ls"
 6)  "yz"
 7)  "tony"
remote:0>zrangebylex height - + limit 2 3
 1)  "hh"
 2)  "lz"
 3)  "ls"
 
13.9 ZRANGEBYSCORE命令
  • ZRANGEBYSCORE 命令返回有序集合 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)顺序排列。命令可用版本:>= 1.2.0

  • 可选参数 LIMIT 指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count )表示分页,注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。

  • 可选参数 WITHSCORES 决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。该选项自 Redis 2.0 版本起可用。

  • 无限区间:min 和 max 也可以是 -inf 和 +inf ,这样一来就可以在不知道有序集的最低和最高 score 值的情况下,使用 ZRANGEBYSCORE 命令。

    默认情况下,区间的取值使用闭区间 (小于等于或大于等于),通过给参数前增加(符号来使用可选的开区间,也就是小于或大于。示例如下:

ZRANGEBYSCORE zset (1 5    #表示 1<score<=4
ZRANGEBYSCORE zset (1 (9  #1<score<9
  • ZRANGEBYSCORE命令的基本语法如下:
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
  • ZRANGEBYSCORE命令的返回值:指定区间内,带有 score 值(可选)的有序集成员的列表。命令演示
#创建有序集合
remote:0>zadd height 160 zs 210 tony 185 ls
"3"
remote:0>zadd height 165 ll 170 hh 180 lz 190 yz
"4"
 #浏览所有元素
remote:0>zrange height 0 9 withscores
 1)  "zs"
 2)  "160"
 3)  "ll"
 4)  "165"
 5)  "hh"
 6)  "170"
 7)  "lz"
 8)  "180"
 9)  "ls"
 10)  "185"
 11)  "yz"
 12)  "190"
 13)  "tony"
 14)  "210
#返回指定范围内的score值的有序集成员的列表。闭区间范围
remote:0>zrangebyscore height 170 190 withscores
 1)  "hh"
 2)  "170"
 3)  "lz"
 4)  "180"
 5)  "ls"
 6)  "185"
 7)  "yz"
 8)  "190"
#返回指定范围内的score值的有序集成员的列表。开区间范围
remote:0>zrangebyscore height (170 (190 withscores
 1)  "lz"
 2)  "180"
 3)  "ls"
 4)  "185"
#限制返回元素的数量,#偏移量为0,数量为1
remote:0>zrangebyscore height 170 190 withscores limit 0 1
 1)  "hh"
 2)  "170"
#偏移量为1,数量为2
remote:0>zrangebyscore height 170 190 withscores limit 1 2
 1)  "lz"
 2)  "180"
 3)  "ls"
 4)  "185"
 
 #浏览所有元素(负无穷-正无穷)
remote:0>zrangebyscore height  -inf +inf withscores
 1)  "zs"
 2)  "160"
 3)  "ll"
 4)  "165"
 5)  "hh"
 6)  "170"
 7)  "lz"
 8)  "180"
 9)  "ls"
 10)  "185"
 11)  "yz"
 12)  "190"
 13)  "tony"
 14)  "210
13.10 ZRANK命令
  • ZRANK 命令返回有序集 key 中成员 member 的排名或下标位置。其中有序集成员按 score 值递增(从小到大)顺序排列。排名以 0 为底,也就是说, score 值最小的成员排名为 0 。命令可用版本:>= 2.0.0

注意:使用 ZREVRANK 命令可以获得成员按 score 值递减(从大到小)排列的排名。

  • ZRANK 命令的基本语法如下:
ZRANK key member 
  • ZRANK 命令的返回值:如果 member 是有序集 key 的成员,返回 member 的排名;如果 member 不是有序集 key 的成员,返回 null。命令演示
#创建有序集合
remote:0>zadd height 160 zs 210 tony 185 ls
"3"
remote:0>zadd height 165 ll 170 hh 180 lz 190 yz
"4"
 #浏览所有元素
remote:0>zrange height 0 9 withscores
 1)  "zs"
 2)  "160"
 3)  "ll"
 4)  "165"
 5)  "hh"
 6)  "170"
 7)  "lz"
 8)  "180"
 9)  "ls"
 10)  "185"
 11)  "yz"
 12)  "190"
 13)  "tony"
 14)  "210
#排名第3
remote:0>zrank height hh
"2"
#排名第1
remote:0>zrank height zs
"0"
#排名第7
remote:0>zrank height tony
"6"

13.11 ZREM命令
  • ZREM 命令移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。当 key 存在但不是有序集类型时,返回一个错误。在 Redis 2.4 版本以前, ZREM 每次只能删除一个元素。命令可用版本:>= 1.2.0

  • ZREM 命令的基本语法如下:

ZREM key member [member ...]
  • ZREM 命令的返回值:被成功移除的成员的数量,不包括被忽略的成员。命令演示
#创建有序集合
remote:0>zadd height 160 zs 210 tony 185 ls
"3"
remote:0>zadd height 165 ll 170 hh 180 lz 190 yz
"4"
 #浏览所有元素
remote:0>zrange height 0 9 withscores
 1)  "zs"
 2)  "160"
 3)  "ll"
 4)  "165"
 5)  "hh"
 6)  "170"
 7)  "lz"
 8)  "180"
 9)  "ls"
 10)  "185"
 11)  "yz"
 12)  "190"
 13)  "tony"
 14)  "210
#删除有序集合成员,也可以同时移除多个成员
remote:0>zrem height tony
"1"
remote:0>zrange height 0 9 withscores
 1)  "zs"
 2)  "160"
 3)  "ll"
 4)  "165"
 5)  "hh"
 6)  "170"
 7)  "lz"
 8)  "180"
 9)  "ls"
 10)  "185"
 11)  "yz"
 12)  "190"
13.12 ZREMRANGEBYRANK命令
  • ZREMRANGEBYRANK 命令移除有序集合 key 中,指定排名(rank)区间内的所有成员。其中区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。命令可用版本:>= 2.0.0

  • ZREMRANGEBYRANK 命令的基本语法如下:

ZREMRANGEBYRANK key start stop
  • ZREMRANGEBYRANK 命令的返回值:被移除成员的数量。命令演示
remote:0>zrange height 0 8 withscores
 1)  "zs"
 2)  "160"
 3)  "ll"
 4)  "165"
 5)  "hh"
 6)  "170"
 7)  "lz"
 8)  "180"
 9)  "ls"
 10)  "185"
 11)  "yz"
 12)  "190"
#移除前4个排名,默认从小到大排名
remote:0>zremrangebyrank height 0 3
"4"
#返回剩余的成员与分数
remote:0>zrange height 0 8 withscores
 1)  "ls"
 2)  "185"
 3)  "yz"
 4)  "190"
13.13 ZREMRANGEBYSCORE命令
  • ZREMRANGEBYSCORE 命令移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。自版本 2.1.6 开始,score 值等于 min 或 max 的成员也可以不包括在内(n。命令可用版本:>= 2.0.0

  • ZREMRANGEBYSCORE 命令的基本语法如下:

ZREMRANGEBYSCORE key min max 
  • ZREMRANGEBYSCORE 命令的返回值:被移除成员的数量。
#显示所有成员与score值
remote:0>zrange height 0 9 withscores
 1)  "zs"
 2)  "160"
 3)  "ll"
 4)  "165"
 5)  "hh"
 6)  "170"
 7)  "lz"
 8)  "180"
 9)  "ls"
 10)  "185"
 11)  "yz"
 12)  "190"
 13)  "tony"
 14)  "210"
#移除185<=height<=210之间的数据
remote:0>zremrangebyscore height 185 210
"3"
#查询剩余元素
remote:0>zrange height 0 9 withscores
 1)  "zs"
 2)  "160"
 3)  "ll"
 4)  "165"
 5)  "hh"
 6)  "170"
 7)  "lz"
 8)  "180"
#移除160<height<180之间的数据
remote:0>zremrangebyscore height (160 (180
"2"
#查询剩余元素
remote:0>zrange height 0 9 withscores
 1)  "zs"
 2)  "160"
 3)  "lz"
 4)  "180"
13.14 ZREVRANGE命令
  • ZREVRANGE 命令返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递减(从大到小)来排列。具有相同 score 值的成员按字典序的逆序排列。
  • 除了成员按 score 值降序排列外, ZREVRANGE 命令的其他方面和 ZRANGE 命令相同。命令可用版本:>= 1.2.0
  • ZREVRANGE 命令的基本语法如下:
ZREVRANGE key start stop [WITHSCORES] 
  • ZREVRANGE 命令的返回值:指定区间内,带有 score 值(可选)的有序集成员的列表。
remote:0>zadd height 160 zs 210 tony 185 ls
"2"
remote:0>zadd height 165 ll 170 hh 180 lz 190 yz
"3"
#添加相同的score值元素
remote:0>zadd height 165 fm 185 mx 210 cl
"3"
#按score 值递增(从小到大)来排列
remote:0>zrange height 0 -1 withscores
 1)  "zs"
 2)  "160"
 3)  "fm"
 4)  "165"
 5)  "ll"
 6)  "165"
 7)  "hh"
 8)  "170"
 9)  "lz"
 10)  "180"
 11)  "ls"
 12)  "185"
 13)  "mx"
 14)  "185"
 15)  "yz"
 16)  "190"
 17)  "cl"
 18)  "210"
 19)  "tony"
 20)  "210"
#按 score 值递减(从大到小)来排列,相同 score 值的成员按字典序的逆序排列。
remote:0>zrevrange height 0 -1 withscores
 1)  "tony"
 2)  "210"
 3)  "cl"
 4)  "210"
 5)  "yz"
 6)  "190"
 7)  "mx"
 8)  "185"
 9)  "ls"
 10)  "185"
 11)  "lz"
 12)  "180"
 13)  "hh"
 14)  "170"
 15)  "ll"
 16)  "165"
 17)  "fm"
 18)  "165"
 19)  "zs"
 20)  "160"
13.15 ZREVRANK命令
  • ZREVRANK 命令返回有序集合 key 中 member 的排名或下标位置。其中有序集合的成员按 score 值递减(从大到小)排序,该命令排序顺序与 ZRANK 命令正好相反。命令可用版本:>= 2.0.0

注意:排名从 0 开始, 也就是说,score 值最大的成员排名为 0 。

  • ZREVRANK 命令的基本语法如下:
ZREVRANK key member 
  • ZREVRANK 命令的返回值:如果 member 是有序集 key 的成员,返回 member 的排名;如果 member 不是有序集 key 的成员,返回 null 。命令演示:
remote:0>zadd height 160 zs 210 tony 185 ls
"2"
remote:0>zadd height 165 ll 170 hh 180 lz 190 yz
"3"
#添加相同的score值元素
remote:0>zadd height 165 fm 185 mx 210 cl
"3"
#按 score 值递减(从大到小)来排列,相同 score 值的成员按字典序的逆序排列。
remote:0>zrevrange height 0 -1 withscores
 1)  "tony"
 2)  "210"
 3)  "cl"
 4)  "210"
 5)  "yz"
 6)  "190"
 7)  "mx"
 8)  "185"
 9)  "ls"
 10)  "185"
 11)  "lz"
 12)  "180"
 13)  "hh"
 14)  "170"
 15)  "ll"
 16)  "165"
 17)  "fm"
 18)  "165"
 19)  "zs"
 20)  "160"
#返回有序集合key中 member 的排名,有序集合以score 值递减(从大到小)来排列
remote:0>zrevrank height ls
"4"
remote:0>zrevrank height lz
"5"
remote:0>zrevrank height tony
"0"
13.16 ZSCORE命令
  • ZSCORE 命令返回有序集 key 中,成员 member 的 score 值。如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 null。命令可用版本:>= 1.2.0

  • ZSCORE 命令的基本语法如下:

ZSCORE key member
  • ZSCORE 命令的返回值:member 成员的 score 值,以字符串形式表示。命令演示
remote:0>del height
"1"
remote:0>zadd height 160 zs 210 tony 185 ls
"3"
remote:0>zrange height 0 -1 withscores
 1)  "zs"
 2)  "160"
 3)  "ls"
 4)  "185"
 5)  "tony"
 6)  "210"
#查看分值
remote:0>zscore height ls
"185"
13.17 ZUNIONSTORE命令
  • ZUNIONSTORE 命令用于计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 目标集合 。

默认情况下,结果集中某个成员的分数值是所有给定集合中该成员的分数值之和。

  • ZUNIONSTORE 命令的基本语法如下:
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] 
  • WEIGHTS:WEIGHTS 选项用来给每个有序集合分别指定一个加权因子,每个有序集合中所有成员的 score 值在传递给聚合函数(aggregation function)之前,都要先乘以该加权因子。如果没有指定 WEIGHTS 选项,加权因子默认设置为 1 。

  • AGGREGATE:使用 AGGREGATE 选项,你可以指定并集的结果集的聚合方式。默认使用的参数 SUM ,可以将所有集合中某个成员的 score 值之和作为结果集中该成员的 score 值;使用 MIN 参数,可以将所有集合中某个成员的最小 score 值作为结果集中该成员的 score 值;而参数 MAX 则是将所有集合中某个成员的最大 score 值作为结果集中该成员的 score 值。(两个集合中相同元素的score如何生成)

  • ZUNIONSTORE 命令的返回值:保存到 destination 的结果集的成员数量。命令演示

remote:0>zadd height 160 zs 210 tony 185 ls
"3"
remote:0>zadd height1 165 ll 170 hh 180 lz 190 yz
"4"
remote:0>zunionstore height2 2 height height1 weights 1 2
"7"
#weights 0.1 0.1 对集合1全体score除10,集合2全体score除10
remote:0>zunionstore height2 2 height height1 weights 0.1 0.1
"7"
remote:0>zrange height2 0 -1 withscores
 1)  "zs"
 2)  "16"
 3)  "ll"
 4)  "16.5"
 5)  "hh"
 6)  "17"
 7)  "lz"
 8)  "18"
 9)  "ls"
 10)  "18.5"
 11)  "yz"
 12)  "19"
 13)  "tony"
 14)  "21"
#weights 0.1 0.1 对集合1全体score除10,集合2全体score乘10
 remote:0>zunionstore height2 2 height height1 weights 0.1 10
"7"
remote:0>zrange height2 0 -1 withscores
 1)  "zs"
 2)  "16"
 3)  "ls"
 4)  "18.5"
 5)  "tony"
 6)  "21"
 7)  "ll"
 8)  "1650"
 9)  "hh"
 10)  "1700"
 11)  "lz"
 12)  "1800"
 13)  "yz"
 14)  "1900"

注意:set/zset/hash可以通过string/list的变体来实现,但是其底层数据结构不一样啊,效率也不一样。如:hash类型自带hash性能和通过json转为string效率上有差距

下一篇:redis学习-18- Redis连接命令和安全策略
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值