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的主要内容,如果未能解决你的问题,请参考以下文章