在游戏中,有很多维度的排行榜,服务器在实现过程中,一般都要预先维护对应因子的zset,比如根据玩家等级来排序,那就需要对应有一个level作为score的zset,如果是以战斗力排序,那就用战力作为score维护一个zset。如果现在临时有一个新需求,需要对一个之前没有维护zset的因子来生成一个排行榜,如何处理?
redis中的sort命令,灵活变通一下,就可以实现上面的需求。先看一下sort命令的说明:
SORT | RedisSorts the elements in a list, a set, or a sorted set, optionally storing the result.https://redis.io/commands/sort/
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]
游戏中对应的玩家数据结构
user_id_list:set,所有玩家编号的汇总
user_info_*:hash,单个玩家的数据信息,
那么根据玩家level生成一个排行榜:
这样可以得到{uid,level,name}这样一个队列,以level排序,类似实现了联表查询,同时这个临时排行榜还可以保存为一个key
这个命令中还有limit,可以限制排行榜的人数,同时临时保存的结果集还可以设置过期时间,作为一个cache存在
sort命令可以实现多个hash,多个string的联合查询
备注:这里我觉得最值得一提的是,sort可以实现多表的联表查询,一个命令搞定,不需要lua脚本就可以实现一次原子操作。