Redis有序集合类型

简介

有序集合类型 顾名思义 与集合类型的区别就是有序 这个有序是在集合类型的基础上 给每个元素关联了一个分数 按照分数进行排序

环境

软件名称 版本号 下载地址
redis 3.2.0 点击下载

步骤

与列表类型的区别

有序集合类型在某些方面和列表类型相似 但是还是有很大的区别

与列表相似的地方:
    1. 两者都是有序的
    2. 两者都可以获取某一个范围的元素

与列表不同的地方:
    1. 列表通过链表实现 所以访问两端数据比较快 访问中间数据会较慢 
    2. 而集合采用散列表和跳跃表 所以没有这个忧虑
    3. 列表不能简单的调整某个元素的位置 但有序集合通过修改元素分数可以 
    4. 有序集合比列表类型更耗费内存

常用命令

下面将详细说明操作Redis有序集合类型的相关命令

增加元素

1
ZADD key score member [score member …]      # 增加元素
127.0.0.1:6379> ZADD num 1 a 2 b 3 c
(integer) 3
127.0.0.1:6379> ZADD num 2 a 2.5 d
(integer) 1
127.0.0.1:6379>

元素的分数可以修改 可以是小数 最后的排序方式就是按照分数排序的

获取元素分数

1
ZSCORE key member           # 获取元素分数
127.0.0.1:6379> ZSCORE num a
"2"
127.0.0.1:6379> ZADD num 3 a 
(integer) 0
127.0.0.1:6379> ZSCORE num a
"3"
127.0.0.1:6379>

获取某个范围的元素

1
2
ZRANGE key start stop [WITHSCORES]      # 获取某个索引范围的元素
ZREVRANGE key start stop [WITHSCORES] # 获取某个索引范围的元素 反序排序
127.0.0.1:6379> ZRANGE num 0 -1
1) "b"
2) "d"
3) "a"
4) "c"
127.0.0.1:6379> ZRANGE num 0 1 WITHSCORES
1) "b"
2) "2"
3) "d"
4) "2.5"
127.0.0.1:6379>

ZRANGE的用法和LRANGE的用法大致一样 只不过多了个 WITHSCORES 可以同时显示分数
如果出现分数相同的情况 则按照 0 < 9 < A < Z < a < z 规则排序

127.0.0.1:6379> ZREVRANGE num 0 -1
1) "c"
2) "a"
3) "d"
4) "b"
127.0.0.1:6379>

可以看到 ZREVRANGE 与 ZRANGE 结果是相反的

获取某个分数范围的元素

1
2
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]     # 获取某个分数范围的元素
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] # 获取某个分数范围的元素 反序排序
127.0.0.1:6379> ZRANGEBYSCORE num 2.5 3
1) "d"
2) "a"
3) "c"
127.0.0.1:6379> ZRANGEBYSCORE num 2.5 (3
1) "d"
127.0.0.1:6379> ZRANGEBYSCORE num (2.5 3
1) "a"
2) "c"
127.0.0.1:6379>

如果不希望获取端点值 可以在端点分数前加 "(" 这样就可以把端点值排除在外了 无穷大可以用 +inf

127.0.0.1:6379> ZRANGEBYSCORE num 2.5 3 LIMIT 0 2
1) "d"
2) "a"
127.0.0.1:6379> ZRANGEBYSCORE num 2.5 3 LIMIT 1 2
1) "a"
2) "c"
127.0.0.1:6379> ZRANGEBYSCORE num 2.5 3 LIMIT 1 3
1) "a"
2) "c"
127.0.0.1:6379> ZRANGEBYSCORE num 2.5 3 LIMIT 0 3
1) "d"
2) "a"
3) "c"
127.0.0.1:6379>

WITHSCORES用法不在赘述 LIMIT是限制结果数量 LIMIT 1 2表示从结果的索引1开始 只要2个结果
ZREVRANGEBYSCORE的用法可以参考ZRANGE与ZREVRANGE的去别 也不再详细说明

增加某个元素的分数

1
ZINCRBY key increment member            # 增加某个元素的分数
127.0.0.1:6379> ZSCORE num a
"3"
127.0.0.1:6379> ZINCRBY num 4 a
"7"
127.0.0.1:6379> ZINCRBY num -2 a
"5"
127.0.0.1:6379>

如果指定的元素不存在 ZINCRBY同样会先创建 赋值为0后在增加分数

获取集合中元素数量

1
ZCARD key               # 获取集合中元素数量
127.0.0.1:6379> ZCARD num
(integer) 4
127.0.0.1:6379> ZADD num 6 e 
(integer) 1
127.0.0.1:6379> ZCARD num
(integer) 5
127.0.0.1:6379>

获得指定分数范围内的元素个数

1
ZCOUNT key min max          # 获得指定分数范围内的元素个数
127.0.0.1:6379> ZRANGE num 0 -1 WITHSCORES
 1) "b"
 2) "2"
 3) "d"
 4) "2.5"
 5) "c"
 6) "3"
 7) "a"
 8) "5"
 9) "e"
10) "6"
127.0.0.1:6379> ZCOUNT num (2.5 5
(integer) 2
127.0.0.1:6379> ZCOUNT num 2.5 5
(integer) 3
127.0.0.1:6379>

获取分数为2.5到5之间元素个数 也可以使用 "(" 是否排查端点

删除一个或多个元素

1
ZREM key member [member …]      # 删除一个或多个元素
127.0.0.1:6379> ZREM num a b 
(integer) 2
127.0.0.1:6379> ZRANGE num 0 -1 
1) "d"
2) "c"
3) "e"
127.0.0.1:6379>

命令返回删除成功的元素数量

按照排名范围删除元素

1
ZREMRANGEBYRANK key start stop          # 按照排名范围删除元素
127.0.0.1:6379> ZREMRANGEBYRANK num 0 1
(integer) 2
127.0.0.1:6379> ZRANGE num 0 -1 WITHSCORES
1) "e"
2) "6"
127.0.0.1:6379>

按照索引范围去删除元素 返回删除成功的元素个数

按照分数范围删除元素

1
ZREMRANGEBYSCORE key min max        # 按照分数范围删除元素
127.0.0.1:6379> ZADD num 2 a 3 b 4 d
(integer) 3
127.0.0.1:6379> ZREMRANGEBYSCORE num (2 4
(integer) 2
127.0.0.1:6379> ZRANGE num 0 -1
1) "a"
2) "e"
127.0.0.1:6379>

删除分数大于2 小于4的元素 返回删除成功的元素个数

获得元素的排名

1
2
ZRANK key member                # 获得元素的排名 正序排序
ZREVRANK key member # 获得元素的排名 反序排序
127.0.0.1:6379> ZRANK num a
(integer) 0
127.0.0.1:6379> ZRANK num e
(integer) 1
127.0.0.1:6379> ZREVRANK num e
(integer) 0
127.0.0.1:6379> ZREVRANK num a
(integer) 1
127.0.0.1:6379>

排序从0开始 ZREVRANK会反序排序 

集合运算

1
2
ZINTERSTORE dest numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]  # 交集
ZUNIONSTORE dest numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] # 并集
numkeys是参与计算的键的个数 WEIGHTS是权重 
AGGREGATE绝定最后结果集合的元素分数是取平均数还是最大最小值

127.0.0.1:6379> ZADD num1 1 a 2 b 3 c 
(integer) 3
127.0.0.1:6379> ZADD num2 1 b 2 c 3 d 
(integer) 3
127.0.0.1:6379> ZINTERSTORE tmp1 2 num1 num2 AGGREGATE SUM
(integer) 2
127.0.0.1:6379> ZRANGE tmp1 0 -1 WITHSCORES 
1) "b"
2) "3"
3) "c"
4) "5"
127.0.0.1:6379>

结果分数是取参与运算元素分数的总数 num1中b的分数是2 num2中b的分数是1 最后结果是3
如果不加AGGREGATE 默认也是去SUM值 所以可以不用加

WEIGHTS参数设置每个集合的权重,每个集合在参与计算时元素的分数会被乘上该集合的权重

127.0.0.1:6379> ZINTERSTORE tmp2 2 num1 num2 WEIGHTS 1 10
(integer) 2
127.0.0.1:6379> zrange tmp2 0 -1 WITHSCORES
1) "b"
2) "12"
3) "c"
4) "23"
127.0.0.1:6379> 

ZUNIONSTORE与ZINTERSTORE用法相似 则不再赘述

附录

命令总结

ZADD key score member [score member …]              增加元素
ZSCORE key member                                   获取元素分数
ZRANGE key start stop [WITHSCORES]                  获取某个索引范围的元素
ZREVRANGE key start stop [WITHSCORES]               获取某个索引范围的元素 反序排序
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]     获取某个分数范围的元素
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]  获取某个分数范围的元素 反序排序
ZINCRBY key increment member                        增加某个元素的分数
ZCARD key                                           获取集合中元素数量
ZCOUNT key min max                                  获得指定分数范围内的元素个数
ZREM key member [member …]                          删除一个或多个元素
ZREMRANGEBYRANK key start stop                      按照排名范围删除元素
ZREMRANGEBYSCORE key min max                        按照分数范围删除元素
ZRANK key member                                    获得元素的排名 正序排序
ZREVRANK key member                                 获得元素的排名 反序排序
ZINTERSTORE dest numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]  交集
ZUNIONSTORE dest numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]  并集