redis应用场景--游戏排行榜
有序集合也是集合,不同之处在于,集合里的元素可以附带这个分数,元素不能重复,但是分数可以重复,不仅如此,还可以根据分数进行排序。
很多游戏都有玩家得分的排行榜,这个排行榜随时处于变动中。
游戏有很多玩家,可以设计一张表,记录每一个玩家的分数,并根据玩家新一局的分数来更新这张表,当需要获取排行榜前10的玩家,只需要查询这张表,根据分数排序并使用limit获取前10位。
但当玩家数量非常多时,整张表会非常大,而且排行榜是可以使用频率非常高的功能,那么对数据库的查询会非常频繁。为此,可以使用redis的有序集合,来实现这个需求。
例子:现在有一些玩家,并且包含了玩家的得分,如下图,现在通过zset来实现对这些玩家的得分进行排序
from redis.client import Redis r = Redis(host='0.0.0.0', port=6379, db=0, password='') # 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-1, withscores=True) for name, score in top_three: print(name.decode(), score) get_top(2) #r.zadd('sort_list', {'小红': 11093}) print("*"*20) get_top(4)
输出结果:
小红 11093.0
小刘 9876.0
********************
小红 11093.0
小刘 9876.0
小王 8765.0
小明 8733.0