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

发布时间 2023-06-08 14:35:39作者: 99号的格调

有序集合也是集合,不同之处在于,集合里的元素可以附带这个分数,元素不能重复,但是分数可以重复,不仅如此,还可以根据分数进行排序。

很多游戏都有玩家得分的排行榜,这个排行榜随时处于变动中。

游戏有很多玩家,可以设计一张表,记录每一个玩家的分数,并根据玩家新一局的分数来更新这张表,当需要获取排行榜前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