Sort-set
优质
小牛编辑
126浏览
2023-12-01
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
ZADD key score member
将所有指定成员添加到键为key有序集合(sorted set)里面
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 1 "uno"
(integer) 1
redis> ZADD myzset 2 "two" 3 "three"
(integer) 2
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "uno"
4) "1"
5) "two"
6) "2"
7) "three"
8) "3"
redis>
ZCOUNT key min max
返回有序集key中,score值在min和max之间(默认包括score值等于min或max)的成员
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZCOUNT myzset -inf +inf
(integer) 3
redis> ZCOUNT myzset (1 3
(integer) 2
redis>
ZINCRBY key increment member
为有序集key的成员member的score值加上增量increment
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZINCRBY myzset 2 "one"
"3"
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "one"
4) "3"
redis>
应用场景
1.带有权重的元素,LOL游戏大区最强王者
2 排行榜
案例
斗地主大赛排名
- 初始比赛
127.0.0.1:6379> ZADD doudizhu_rank 0 "player1" (integer) 1 127.0.0.1:6379> ZADD doudizhu_rank 0 "player2" (integer) 1 127.0.0.1:6379> ZADD doudizhu_rank 0 "player3" (integer) 1
- 比赛开始,经过n轮比赛,每次统计,类似计算如下所示
127.0.0.1:6379> ZINCRBY doudizhu_rank 3 player3 "3" 127.0.0.1:6379> ZINCRBY doudizhu_rank -1 player2 "-1" 127.0.0.1:6379> ZINCRBY doudizhu_rank -2 player1 "-2"
- 比赛结束,进行排名
逆序排序才对127.0.0.1:6379> ZRANGE doudizhu_rank 0 -1 1) "player1" 2) "player2" 3) "player3" 127.0.0.1:6379> ZRANGE doudizhu_rank 0 -1 withscores 1) "player1" 2) "-2" 3) "player2" 4) "-1" 5) "player3" 6) "3"
127.0.0.1:6379> zrevrange doudizhu_rank 0 -1 withscores 1) "player3" 2) "3" 3) "player2" 4) "-1" 5) "player1" 6) "-2" 127.0.0.1:6379>