1、需求:①完成游戏排行榜实时刷新 ②查看当前用户的排名、积分
2、参考文章:https://www.cnblogs.com/clubs/p/11691580.html (博主强推)
https://www.cnblogs.com/anny-1980/p/4583806.html (Redis的ZSET有序集合常用语法)
3、实现原理:不使用MySQL进行存储,改用redis的zset实现,单机支持百万级并发,数据热更新
4、附录我自己封装好的一个laravel5的Redis排行榜类:
<?php /** * Created by Zend Studio. * User: Xuzhz <857328943@qq.com> * name: Redis的ZSET 实现游戏排行榜实时刷新 * Date: 2019年12月30日 * Time: 下午4:30:23 */ namespace AppDao; use IlluminateSupportFacadesRedis; class AtminiRankDao { /** * 新增|递增 有序集合元素 * @param : $key 集合名称; $value 用户标识id; $score 权重; * @return : boolean * date: 2019年12月30日下午4:36:46 * author: xzz */ public static function set($key='北京', $value=1, $score=0) { try { Redis::ZINCRBY($key, $score, $value); log_write('用户分数接口:事件-用户分数增加,用户ID-'.$value.', 分数增加量-'.$score.', 所属榜单-'.$key); Redis::ZINCRBY('全国', $score, $value); log_write('用户分数接口:事件-用户分数增加,用户ID-'.$value.', 分数增加量-'.$score.', 所属榜单-全国'); return true; } catch (Exception $e) { return false; } } public static function add($key='北京', $value=1, $score=0) { try { Redis::ZADD($key, $score, $value); log_write('用户分数接口:事件-新增用户,用户ID-'.$value.', 分数增加量-'.$score.', 排行榜-'.$key); Redis::ZADD('全国', $score, $value); log_write('用户分数接口:事件-新增用户,用户ID-'.$value.', 分数增加量-'.$score.', 所属榜单-全国'); return true; } catch (Exception $e) { return false; } } /** * 获取指定KEY排行榜倒序排名,可选择同时返回权重 * @param : $key 集合名称; $start 开始下标; $stop 结束下标(-1全部); $withscores 是(true)否(false)返回权重score * @return : array , 包含排名、value、score * date: 2019年12月30日下午4:46:11 * author: xzz */ public static function zrevrange($key='全国', $start=0, $stop=-1, $withscores=true) { $rank = []; if ($withscores === true) { $rank = Redis::ZREVRANGE($key, $start, $stop, 'withscores'); } else { $rank = Redis::ZREVRANGE($key, $start, $stop); } return $rank; } /** * 获取指定KEY集合中某value对应的排名 * @param : $key 集合名称; $value 具体值(用户id); $flag 是(true)否(false)倒序 * @return : int or false * date: 2019年12月30日下午4:59:26 * author: xzz */ public static function zrevrank($key='全国', $value=1, $flag=true) { $index = false; try { if ($flag === true) { $index = Redis::ZREVRANK($key, $value); } else { $index = Redis::ZRANK($key, $value); } } catch (Exception $e) { return false; } return $index; } /** * 获取指定KEY集合中某value的实时权重 * @param : $key 集合名称; $value 具体值(用户id) * @return : int or false * date: 2019年12月30日下午4:59:26 * author: xzz */ public static function zscore($key='全国', $value=1) { $index = 0; try { $index = Redis::ZSCORE($key, $value); } catch (Exception $e) { return false; } return $index; } }