今天接到一个需求,需要获取一个根据用户的总成绩及地区进行一个排名,参与人数约为20万,原计划直接查库操作,后来考虑到需要将所有数据查出再做排名处理,有可能会查询效率问题,最后决定用redis的有序集合来解决这一问题,大概逻辑如下:
一、返回所有参与用户地市的排名,按照分数从高到低排序
$redis = Redis::connection(); $redisKey = 'user-ranking-list-'.$city.':';//定义当前地市排名 $total = $redis->zcard($redisKey) $result = $redis->zrangebyscore($redisKey, 0, $total);
二、验证用户是否存在,不存在则直接插入并返回排名,存在即返回当前排名
if($redis->zrevrank($redisKey, $mobile) == null){ $redis->zadd($redisKey, $score, $mobile); } $sort = $redis->zrevrank($redisKey,$mobile)+1;//排名+1
更多有序集合介绍可以参考:https://www.runoob.com/redis/redis-sorted-sets.html