十一、Redis有序集合(sorted set)命令参考记录
Redis有序集合,顾名思义,重点在于有序。
在集合类型的基础上有序集合类型为集合中的每个元素都关联了一个分数,因此可以完成插入、删除、判断元素是否存在等集合类型支持的操作,还可以获得分类最高(最低)的前N个元素、获得指定分数范围内的元素与分类有关的操作。
有序集合与列表类型有些相似
相似点
- 都是有序的
- 都可以获得某一些范围内的元素
区别
- 列表类型是通过链表实现的,获取靠近两端的数据非常快,元素增多后,获取中间数据的速度较慢,因此链表更适合实现如“新鲜事”、“日志”等很少访问中间元素的应用
- 有序集合使用哈希表和跳跃表实现,即使读取中间部分的数据速度也很快
- 列表中不能简单地调整某个元素的位置,有序集合可以
- 有序集合比列表更消耗内存
基础操作命令
zadd 向集合中添加一个或多个元素和该元素的分数
语法:zadd key score1 member1 [score2 member2 ...]
127.0.0.1:6379> zadd board 89 tom 60 peter 100 hipi
(integer) 3
# 修改分数
127.0.0.1:6379> zadd board 87 hipi
(integer) 0
zscore 获取元素分数
语法:zscore key member
127.0.0.1:6379> zscore board hipi
"87"
zrange 获取排名在某个范围的元素列表
语法:zrange key start stop [withscores]
127.0.0.1:6379> zrange board 0 -1
1) "peter"
2) "hipi"
3) "tom"
127.0.0.1:6379> zrange board 0 2
1) "peter"
2) "hipi"
3) "tom"
127.0.0.1:6379> zrange board 0 -1 withscores
1) "peter"
2) "60"
3) "hipi"
4) "87"
5) "tom"
6) "89"
zrange按照分数值 从大到小排序。下标参数start和stop都是以0为底
zrevrange 返回有序集合中指定区间内的成员,通过索引,分数由高到低
语法:zrevrange key start top [withscores]
127.0.0.1:6379> zrevrange board 0 -1
1) "tom"
2) "hipi"
3) "peter"
其中成员的位置按分数值递减(从大到小)来排列。
zrangebyscore 获取指定分数范围的元素
语法:zrangebyscore key min max [withscores] [limit offset count]
127.0.0.1:6379> zrangebyscore board 80 100
1) "hipi"
2) "tom"
# 获取高于60分的前3人
127.0.0.1:6379> zrangebyscore board 60 +inf limit 1 3
1) "qiutian"
2) "hipi"
3) "tom"
若分数不包含端点值,分数前加 ( ,如包含80分,则用 (80;
min与max支持无穷,-inf和+inf分别表示负无穷与正无穷
zrevrangebyscore 返回有序集合中指定分区区间内的成员,分数从高到低排序
语法:zrevrangebyscore key max min [withscores]
127.0.0.1:6379> zrevrangebyscore board 100 0 limit 0 3
1) "wendy"
2) "tom"
3) "hipi"
zincrby 增加某个元素的分数
语法:zincrby key increment member
# 返回值为更改后的分数
127.0.0.1:6379> zincrby board 4 jerry
"60"
zcard 获取集合中元素的数量
语法:zcard key
127.0.0.1:6379> zcard board
(integer) 6
zcount 获取指定分数范围内的元素个数
语法:zcount key min max
127.0.0.1:6379> zcount board 90 100
(integer) 1
zrem 删除一个或多个元素
语法:zrem key member1 [member2 ...]
127.0.0.1:6379> zrem board tom
(integer) 1
zremrangebyrank 按照排名范围删除元素
语法:zremrangebyrank key start stop
127.0.0.1:6379> zadd testrem 1 a 2 b 3 c 4 d 5 e 6 f 7 g
(integer) 7
127.0.0.1:6379> zremrangebyrank testrem 0 2
(integer) 3
127.0.0.1:6379> zrange testrem 0 -1
1) "d"
2) "e"
3) "f"
4) "g"
zremrangebyscore 按照分数范围删除元素
语法:zremrangebyscore key min max
127.0.0.1:6379> zremrangebyscore testrem (4 5
(integer) 1
zrank 获取元素的排名
语法:zrank key member
127.0.0.1:6379> zrank board hipi
(integer) 3
该命令按照元素分数从小到大的顺序获得指定的元素排名(从0开始)
有序集合操作
zinterstore 计算有序集合的交集
语法:zinterstore destination numkeys key1 [key2 ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
解释:该命令用来计算多个有序集合的交集并将结果存储在destination键中,返回值为destination键中元素个数;
127.0.0.1:6379> zadd sorte1 1 a 2 b
(integer) 2
127.0.0.1:6379> zadd sorte2 10 a 20 b
(integer) 2
# 1)当AGGREGAET是SUM时,destination键中元素的分数是每个参与计算的集合中该元素的分数的和
127.0.0.1:6379> zinterstore sorteResult 2 sorte1 sorte2
(integer) 2
127.0.0.1:6379> zrange sorteResult 0 -1 withscores
1) "a"
2) "11"
3) "b"
4) "22"
# 2)当AGGREGATE是MIN时,destination键中的元素分数是每个参与计算的集合中该元素分数的最小值
127.0.0.1:6379> zinterstore result1 2 sorte1 sorte2 AGGREGATE MIN
(integer) 2
127.0.0.1:6379> zrange result1 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
# 3)当AGGREGATE是MAX时,destination键中的元素分数是每个参与计算的集合中该元素分数的最大值
127.0.0.1:6379> zinterstore result2 2 sorte1 sorte2 AGGREGATE MAX
(integer) 2
127.0.0.1:6379> zrange result2 0 -1 withscores
1) "a"
2) "10"
3) "b"
4) "20"
127.0.0.1:6379>
# 3)设置每个集合的权重,每个集合在参与计算时元素的分数会被乘上集合的权重
127.0.0.1:6379> zinterstore result3 2 sorte1 sorte2 weights 1 0.1
(integer) 2
127.0.0.1:6379> zrange result3 0 -1
1) "a"
2) "b"
zunionstore 计算一个或多个有序集合的并集
语法:zunionstore destination numkeys key1 [key2 ...]
127.0.0.1:6379> zunionstore ureslut1 2 result1 result1
(integer) 2