redis应用场景---游戏排行榜

有序集合

有序集合也是集合,不同之处在于,集合里的元素(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

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案