redis 有序集合

Jackey Redis 3,149 次浏览 , , 没有评论

有序集合(zset)

有序集合和集合一样,都可以包含任意数量的、各不相同的元素( element),不同于集合的是,有序集合的每个元素都关联着一个浮点数格式的分 值(score),并且有序集合会按照分 值,以从小到大的顺序来排列有序集合中的各个元素。
虽然有序集合中的每个元素都必 须是各不相同的,但元素的分 值并没有这一限制,换句话来说,两个不同元素的分值可以是相同的。

添加元素

ZADD key score element [[score element] [score element] ...]
按照给定的分值和元素,将任意数量的元素添加到有序集合里面,命令的返回 值为成功添加的元素数量。
redis> ZADD fruits-price 3.2 香蕉
1
redis> ZADD fruits-price 2.0 西瓜
1
redis> ZADD fruits-price 4.0 番石榴 7.0 梨 6.8 芒果
3

删除元素

ZREM key element [element ...]
从有序集合中删除指定的元素,以及这些元素关联的分值,命令返回被成功删除的元素数量。
redis> ZADD fruits-price …
5
redis> ZREM fruits-price 番石榴 梨 芒果
3
redis> ZREM fruits-price 西瓜
1

返回元素的分值

ZSCORE key element
返回有序集合中,指定元素的分 值。
redis> ZSCORE fruits-price 西瓜
2
redis> ZSCORE fruits-price 香蕉
3.2000000000000002
redis> ZSCORE fruits-price 芒果
6.7999999999999998

注意
因为分值储存的是浮点数,所以它们是不精确的,这看上去有点奇怪,但并不影响使用。
比如说,大多数编程语言都会将香蕉和芒果的价格看作是 3.2和 6.8 。

增加或减少元素的分值

ZINCRBY key increment element
为有序集合指定元素的分 值加上增量 increment ,命令返回执行操作之后,元素的分 值。
没有相应的 ZDECRBY 命令,但可以通过将 increment 设置为负数来减少分值。
redis> ZINCRBY fruits-price 1.5 西瓜
3.5
redis> ZINCRBY fruits-price -0.8 香蕉
2.4000000000000004

返回有序集合的基数

ZCARD key
返回有序集合包含的元素数量(基数)。复 杂度为 O(1) 。
redis> ZADD fruits-price 3.2 香蕉
1
redis> ZCARD fruits-price
1
redis> ZADD fruits-price 2.0 西瓜
1
redis> ZCARD fruits-price
2
redis> ZADD fruits-price 4.0 番石榴 7.0 梨 6.8 芒果
3
redis> ZCARD fruits-price
5

返回元素的排名(rank)

ZRANK key element
返回指定元素在有序集合中的排名,其中 排名按照元素的分值从小到大计算。
排名以 0 开始。


redis> ZRANK fruits-price 西瓜
0
redis> ZRANK fruits-price 番石榴
2
redis> ZRANK fruits-price 芒果
3

返回元素的逆序排名(reverse rank)

ZREVRANK key member
返回成员在有序集合中的逆序排名,其中 排名按照元素的分值从大到小计算。
排名以 0 开始。


redis> ZREVRANK fruits-price 西瓜
4
redis> ZREVRANK fruits-price 番石榴
2
redis> ZREVRANK fruits-price 芒果
1

获取指定索引范围内的升序元素

ZRANGE key start stop [WITHSCORES]
返回有序集合在按照分值从小到大排列元素(升序排列) 的情况下,索引 start 至索引 stop 范围之内的所
有元素。
两个索引都可以是正数或者 负数。当给定 WITHSCORES 选项时,命令会将元素和分值一并返回。


redis> ZRANGE fruits 0 2
西瓜
香蕉
番石榴
redis> ZRANGE fruits -5 -4
西瓜
香蕉

获取指定索引范围内的降序元素

ZREVRANGE key start stop [WITHSCORES]
返回有序集合在按照分值从大到小排列元素(降序排列) 的情况下,索引 start 至索引 stop 范围之内的所有元素。
两个索引都可以是正数或者 负数。当给定 WITHSCORES 选项时,命令会把元素和分值一并返回。
redis> ZREVRANGE fruits 0 2

芒果
番石榴
redis> ZREVRANGE fruits -5 -4

芒果

获取指定分值范围内的升序元素

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回有序集合在按照分值升序排列元素的情况下,分值在 min 和 max 范围之内的所有元素。
给定 WITHSCORES 选项时,元素和分值会一并返回。给定 LIMIT 选项时,可以通过 offset 参数指定返回的结果集要跳过多少个元素,而 count 参数则用于指定返回的元素数量。
redis> ZRANGEBYSCORE fruits 3.0 7.0
香蕉
番石榴
芒果

获取指定分值范围内的降序元素

ZREVRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回有序集合在按照分值降序排列元素的情况下,分值在 min 和 max 范围之内的所有元素。
给定 WITHSCORES 选项时,元素和分值会一并返回。给定 LIMIT 选项,可以通过 offset 参数指定返回的结果集要跳过多少个元素,而 count 参数则用于指定返回的元素数量。
redis> ZREVRANGEBYSCORE fruits 7.0 3.0

芒果
番石榴
香蕉

计算给定分值范围内的元素数量

ZCOUNT key min max
返回有序集合在升序排列元素的情况下,分 值在 min 和 max 范围内的元素数量。
redis> ZCOUNT fruits 3.0 7.0
4
redis> ZCOUNT fruits 5.0 10.0
2

移除指定排名范围内的升序排列元素

ZREMRANGEBYRANK key start stop
移除有序集合中,元素按升序 进行排列的情况下,指定排名范 围内的所有元素。
排名范围可以使用正数和负数。
redis> ZREMRANGEBYRANK fruits 0 2
(integer) 3
redis> ZRANGE fruits 0 -1
芒果

移除指定分值范围内的升序排列元素

ZREMRANGEBYSCORE key min max
移除有序集合中,分值范围介于 min 和 max 之内的所有元素。
redis> ZREMRANGEBYSCORE fruits 3.0 5.0
2
redis> ZRANGE fruits 0 -1
西瓜
芒果

计算并集和交集

ZUNIONSTORE destkey numkeys key [key ...] 计算并集
ZINTERSTORE destkey numkeys key [key ...] 计算交集

计算结果会被储存到 destkey 里面,命令返回结果集的基数。
numkeys 参数指定要进行计算的有序集合个数, key [key ...] 指定进行计算的各个有序集合。

redis> ZADD fruits-8-13 300 "apple" 200 "banana" 150 "cherry" # 8 月 13 日水果销量
(integer) 3
redis> ZADD fruits-8-14 250 "apple" 300 "banana" 100 "cherry" # 8 月 14 日水果销量
(integer) 3
redis> ZUNIONSTORE fruits-8-13&14 2 fruits-8-13 fruits-8-14 # 计算 8 月 13 日和 14 日的总水果销量
(integer) 3
redis> ZRANGE fruits-8-13&14 0 -1 WITHSCORES
1) "cherry"
2) "250"
3) "banana"
4) "500"
5) "apple"
6) "550"

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Go