Redis入门 五 有序集合类型
3.6 有序集合类型
3.6.1 介绍
在集合类型的基础上有序集合类型为几何中的每个元素都关联了一个分数,这使得我们不仅可以完成插入,删除和判断元素是否存在等集合类型支持的操作,还能够获得分数最高(或最低)的前N个元素、获得指定分数范围内的元素等与分数有关的操作。
有序集合类型在某些方面和类型列表类型有些相似。
- 二者都是有序的
- 二者都可以获得某一范围的元素
区别
- 列表类型是通过链表实现的,获取靠近来个那段的数据速度越快,而当元素增多后,访问中间数据的速度会较慢。
- 有序集合类型使用散列表和跳跃表实现的,所以即使读取位于中间部分的数据速度也很快(时间复杂度是O(logN))
- 列表中不能简单地调整某个元素的位置,但是有序集合可以(通过更改这个元素的分数)
- 有序集合要比列表类型更消费内存
3.6.2 命令
- 增加元素
ZADD key score member [score member …]
ZADD 命令用来向有有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。ZADD命令的返回值是加入到集合中的元素个数(不包含之前已经存在的元素)。
假设我们用有序集合模拟记分板,现在要记录Tom、Peter和David三名运动员的分数(89、67、100)
redis> ZADD scoreboard 89 Tom 67 Peter 100 David
(integer) 3
分数不仅可以是整数,还支持双精度浮点数
- 获得元素的分数
ZSCORE key member
redis> ZSCORE scoreboard Tom
"89"
- 获得排名在某个范围内的元素列表
ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WINNTHSCORES]
ZRANGE 命令会按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素).ZEANGE命令与LRANGE命令十分相似,如索引都是从0开始,负数代表从后向前查找(-1代表最后一个数)。
redis> ZRANGE scoreboard 0 2
1) "Peter"
2) "Tom"
3) "David"
如果需要同时获得元素的分数的话可以在ZRANGE命令的尾部加上WINTHSCORES参数,这时返回的数据格式就从"元素1,元素2,…“变为"元素1,分数1,…”
如果两个元素的分数相同,Redis会按照字典顺序来排序。
- 获得指定分数范围的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
ZRANGEBYSCORE命令按照元素从小到大返回分数在min和max之间(包含min和max)的元素。
redis> ZRANGEBYSCORE scoredboard 80 100
1) "Tom"
2) "David"
如果希望分数范围不包含端点值,可以在分数前加上“(”符号。
- 增加某个元素的分数
ZINCRBY key increment member
ZINCRBY命令可以增加一个元素的分数,返回值是更新后的分数。incremet也可以是个负数表示减分。如果指定的的元素不存在,Redis在实行命令前会先建立它并将它的分数赋为0在执行操作。
3.6.4 命令拾遗
- 获得集合元素的数量
ZCARD key
- 获得指定分数范围的元素个数
ZCOUNT key min max
- 删除一个或多个元素
ZREM key member [member …]
ZREM 命令的返回值是成功删除的元素数量(不包含本来就不存在的元素)
- 按照排名范围删除元素
ZREMANGEBYRANK key start stop
ZREMANGEBYRANK命令按照元素分数从小到大的顺序(索引0表示最小的值)删除处在指定排名范围内的所有元素,并返回删除的元素数量。
- 按照分数范围删除元素
ZREMRANGEBYSCORE key min max
ZREMERANGEBYSCORE 命令会删除指定分数范围内的所有元素,参数min和max的特性和ZRANGEBYSCORE民工中的一样,返回值是删除的元素数量。
- 获得元素排名
ZRANK key member
ZREVRANK key member
ZRANK 命令会按照元素分数从小到大的顺序获得指定的元素的牌型(从0开始).ZREVRANK命令正好相反(分数最大的元素排名为0)