Redis使用---SortedSet

Posted 读书使人进步

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis使用---SortedSet相关的知识,希望对你有一定的参考价值。

  Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行的排序。尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于Sorted-Sets中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。

常用命令

命令

时间复杂度

描述

返回值

ZADD key score member

[[score member] ...]

O(M*log(N)),N 是基数,M为新成员的数量。

将一个或多个member元素及其score值加入到有序集key当中.如果member已经是有序集的成员,那么更新这个member的 score值,并通过重新插入这个member元素,来保证该member 在正确的位置上.score值可以是整数值或双精度浮点数.如果 key不存在,则创建一个空的有序集并执行ZADD操作.当key存在但不是有序集类型时,返回一个错误.

被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。

ZCARD

O(1)

当key存在且是有序集类型时,返回有序集的基数.当key不存在时,返回0 。

 

ZCOUNT key min max

O(log(N)),N为有序集的基数。

返回有序集key中,score值在min和max之间(默认包括 score 值等于min或max )的成员的数量。

 

ZINCRBY key increment member

O(log(N))

为有序集key的成员member的score值加上增量increment.可以通过传递一个负数值increment ,让score减去相应的值,比如 ZINCRBY key -5 member.当key不存在,或membe不是key的成员时,INCRBY key increment member等同于 ZADD key increment member.当key不是有序集类型时,返回一个错误.

member 成员的新score 值,以字符串形式表示.

ZRANGE key start stop [WITHSCORES]

O(log(N)+M),为有序集的基数,M为结果集的基数。

返回有序集key中,指定区间内的成员(按score值递增排序).相同score值的成员按字典序来排列.如果需要按score值递减来排列,使用 ZREVRANGE 命令.下标参数start和stop都以0为底.可以使用负数下标,-1表示最后一个成员,-2表示倒数第二个成员.超出范围的下标并不会引起错误。比如说,当start的值比有序集的最大下标还要大,或是start > stop时,ZRANGE命令只是简单地返回一个空列表;假如stop参数的值比有序集的最大下标还要大,将stop当作最大下标来处理。WITHSCORES选项让成员和它的 score值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。

指定区间内,带有 score 值(可选)的有序集成员的列表。

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

O(log(N)+M),N 为有序集的基数,M 为被结果集的基数。

返回有序集key中,所有score值介min和max之间(包括等于 mi或max )的成员。有序集成员按score值递增次序排列,具有相同 score 值的成员按字典序来排列.可选的 LIMIT 参数指定返回结果的数量及区间.注意当offset很大时,定位offset的操作可能需要遍历整个有序集,此过程最坏复杂度O(N)时间。min和max可以是-inf和+inf .默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。

指定区间内,带有 score 值(可选)的有序集成员的列表。

ZRANK key member

O(log(N))

返回有序集key中成员member的排名.其中有序集成员按score值递增顺序排列.排名以0为底。使用 ZREVRANK 命令可以获得成员按score值递减排列的排名。

member是有序集 key的成员,返回的排名.如果不是返回 nil 。

ZREM key [member ...]

O(M*log(N)),N为基数,M为被成功数量。

移除有序集key中的一个或多个成员,不存在的成员将被忽略。当key存在但不是有序集类型时,返回一个错误。

被成功移除的成员的数量,不包括被忽略的成员。

ZREMRANGEBYRANK key start stop

O(log(N)+M),N 为基数,而M 为被移除数量。

移除有序集key中,指定排名(rank)区间内的所有成员.

区间分别以下标参数start和stop指出,包含start和 stop在内。可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员。

被移除成员的数量。

ZREMRANGEBYSCORE key min max

O(log(N)+M),N为数,而M为被移除数量。

移除有序集key中,所有score值介于min和max之间(包括等于min或max )的成员。

被移除成员的数量。

ZSCORE key member

O(1)

返回有序集key中,成员member的score值。如果 member不存在,或key不存在,返回nil 。

成员的score 值

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

O(N)+O(M log(M)), N 为给定有序集基数的总和, M 为结果集的基数。

计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。默认情况下,结果集中某个成员的 score值是所有给定集下该成员 score值之和。使用 WEIGHTS 选项,可以为每个给定有序集分别指定一个乘法因子(multiplication factor),每个给定有序集的所有成员的 score 值在传递给聚合函数(aggregation function)之前都要先乘以该有序集的因子。乘法因子默认设置为 1 。使用 AGGREGATE 选项,你可以指定并集的结果集的聚合方式。默认使用的参数SUM ,可以将score 值之和作为结果集中该成员的score值;使用参数MIN,将最小score值作为结果集中该成员的score值;而参数MAX则是将最大score值作为结果集中该成员的 score 值。

保存到 destination 的结果集的基数。

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

 

计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和.

保存到 destination 的结果集的基数。

ZLEXCOUNT key min max

O(log(N)),N为有序集合包含的元素数量。

对于一个所有成员的分值都相同的有序集合键key来说,这个命令会返回该集合中,成员介于min和max范围内的元素数量。

 

ZREMRANGEBYLEX key min max

 

对于一个所有成员的分值都相同的有序集合键 key 来说, 这个命令会移除该集合中, 成员介于 min 和 max 范围内的所有元素。

 

ZRANGEBYLEX key min max [LIMIT offset count]

 

当有序集合的所有成员都具有相同的分值时,有序集合的元素会根据成员的字典序来进行排序,而这个命令则可以返回给定的有序集合键 key中,值介于min和max 之间的成员.如果有序集合里面的成员带有不同的分值, 那么命令返回的结果是未指定的(unspecified)。命令会使用 C 语言的 memcmp() 函数,对集合中的每个成员进行逐个字节的对比(byte-by-byte compare), 并按照从低到高的顺序, 返回排序后的集合成员。 如果两个字符串有一部分内容是相同的话, 那么命令会认为较长的字符串比较短的字符串要大。

 


应用范围

  • 可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOP TEN的用户信息。当然我们也可以利用ZRANK命令通过username来获取玩家的排行信息。最后我们将组合使用ZRANGE和ZRANK命令快速的获取和某个玩家积分相近的其他用户的信息。
  • Sorted-Sets类型还可用于构建索引数据。

以上是关于Redis使用---SortedSet的主要内容,如果未能解决你的问题,请参考以下文章

javaio流总结,真香

kafka教程菜鸟,斩获offer

Java基础入门教程!javaio流总结

手把手教你写!图解Janusgraph系列-并发安全

大厂架构师经验分享!全栈系统化的学习路线

使节点 Redis get() 同步