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); 當然數據庫也要更新