php redis實現高並發排行榜


php redis實現高並發排行榜

 

為什么用redis做?? 那還不是為了高並發下減少mysql壓力(還有因為排行榜數據庫比較少可以用redis存)

redis實現高並發下的排行榜邏輯較為復雜

 

我這里先說下 mysql數據和redis數據保持一致的方法(排行榜redis要存 mysql也要存) 我這里用的是清空redis數據庫  然后重新從mysql讀取保存到redis 這個方法比較簡單

 

實現如下

 

$redis->flushall();

$key = 'rank';

$zcount = $redis->zCount($key, 0, 10);

if ($zcount == 0) {
//這個地方一定要加分布式鎖 因為要保證執行1次(比如1000個人並發 那就是觸發1次) 保證執行完才能進行redis操作

$sql = 'select id,count from cc_player';
$playerlist = $this->commongetinfo($sql);
$key = 'rank';

foreach ($playerlist as $k => $v) {
//如果發現重復id不會重復添加
//zadd key score member
$redis->zAdd($key, $v['count'], $v['id']);
}
}

 排序如下

   //withscores 如果是 顯示分數$['member']=>key
       //           如果不是  顯示分數$[]=>member
       //  limit和mysql用法一樣 分頁用的
      $ss=$redis->zrevrangebyscore($key,'+inf','-inf',['withscores' => true, 'limit' => [0, 10]]);
 //   增加分數如下
                $redis->zincrby($key, 1, 107);  當然數據庫也要更新 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM