有序集合也是集合,不同之处在于,集合里的元素(string)可以附带这个分数,元素不能重复,但是分数可以重复,不仅如此,还可以根据分数进行排序。
很多游戏都有玩家得分的排行榜,这个排行榜随时都处于变动中,如果是你,该如何设计实现这个功能呢?
游戏有很多玩家,你大可以设计一张表,记录每一个玩家的游戏分数,并根据玩家新一局的分数来更新这张表,当需要获取排行榜的前10名玩家时,只需要查询这张表即可,根据分数排序并使用limit获取前10位。
这看起来是一个非常稳妥可行的方案,但当玩家数量非常多时,整张表会非常的大,而且排行榜是可以使用频率非常高的功能,那么对数据库的查询会非常频繁。你可以降低排行榜的更新频率来降级对数据库的压力,但使用redis的有序集合,可以帮你完美的对应这个需求。
下面的例子中,我将模拟一个排行榜,并在更新其中一个人的分数后再次获取排行榜
from redis.client import Redis
r = Redis(host='127.0.0.1', port=6379, db=0, password='198671724zds')
r.zadd('sort_list', {'小明': 8733})
r.zadd('sort_list', {'小刚': 4355})
r.zadd('sort_list', {'小红': 5635})
r.zadd('sort_list', {'小丽': 7653})
r.zadd('sort_list', {'小王': 8765})
r.zadd('sort_list', {'小刘': 9876})
def get_top(count):
top_three = r.zrevrange('sort_list', 0, count, withscores=True)
for name, score in top_three:
print(name.decode(), score)
get_top(2)
r.zadd('sort_list', {'小红': 11093})
print("*"*20)
get_top(2)
QQ交流群: 211426309