Redis 有序集合(sorted set)

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

zadd key score1 member1 [score2 member2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数

zscad key
获取有序集合的成员数

zcount key min max
获取指定分值区间的集合成员数

zincrby key increment member
有序集合中对指定成员的分数加上增量 increment。返回新的分值

计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中

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

zinterstore 命令标识
destination 存储交集的新集合
numkeys 计算交集的原始集合数
key 原始集合的key
weight:权重值,跟原始集合的顺序数量保持一致
SUM|MIN|MAX 计算交集成员分值的方式

SUM 交集成员的分值 == (key score) *weight + (key1 score) *weight1

MIN 交集成员的分值 == (key score) *weight ?(key1 score) *weight1 分值较小的成员

MAX 交集成员的分值 == (key score) *weight ?(key1 score) *weight1 分值较大的成员

#取zkey1 和zkey2 2个有序集合的交集 保存至有序集合zkey3,权重配置为 10 和 1(zkey3若不存在则新建,若存在则覆盖)
# zkey3 score = (zkey1 score)*10 + (zkey2 score)*1 
# 例如 one score: 20 = 1*10+10*1
127.0.0.1:6379> zinterstore zkey3 2 zkey1 zkey2 weights 10 1 SUM
(integer) 2
127.0.0.1:6379> zrange zkey3 0 -1 withscores
1) "one"
2) "20"
3) "two"
4) "40"

计算给定的一个或多个有序集的并集,并存储在新的 key 中。原理同zinterstore

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

其他常用命令

zrange key start stop [WITHSCORES]
通过索引区间返回有序集合成指定区间内的成员,WITHSCORES 同时返回分值
127.0.0.1:6379> zrange new 0 -1 withscores
获取有序集合new的所有成员,并获取成员的分值

zrevrange key start stop [WITHSCORES]
edis Zrevrange 命令返回有序集中,指定区间内的成员。
其中成员的位置按分数值递减(从大到小)来排列。
具有相同分数值的成员按字典序的逆序(reverse lexicographical order)排列。

zrangebyscore key mix max [WITHSCORES] [LIMIT offset count]
通过分数返回有序集合指定区间内的成员

zrevrangebyscore key mix max [WITHSCORES] 
返回有序集中指定分数区间内的成员,分数从高到低排序


zrank key member
返回有序集合中指定成员的索引 按分值从低到高排序

zrevrank key member 
返回有序集合中指定成员的索引 按分值从高到低排序

zscore key member 
返回集合成员的分值
zrem key member [member ...]
移除有序集合中的一个或多个成员

ZREMRANGEBYRANK key start stop 
移除有序集合中给定的排名区间的所有成员

ZREMRANGEBYSCORE
移除有序集合中给定的分值区间的所有成员