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 App\Dao; use Illuminate\Support\Facades\Redis; 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; } }