redis互斥鎖解決緩存雪崩問題
剛1000個人並發 突然redis緩存失效 那全部打入數據庫
解決方法 就是redis寫個互斥鎖 緩存失效的時候 先鎖住 等有緩存了 再解鎖 比方說第一個人 加鎖 加緩存 999個人就可以直接讀取緩存了 這樣就不會1000個人讀取數據庫了
public function getcacheinfo($sql, $zhanwei = '', $key = '', $expire = 20, $debug = 0) { if (empty($key)) { if (!empty($zhanwei)) { $strs = join($zhanwei, '&'); } else { $strs = ''; } $key = md5($sql . $strs); } //連接本地的 Redis 服務 $redis = \RedisClient::getInstance(); $result = $redis->get($key); // 獲取存儲的數據 if (empty($result)) { //redis鎖表 防止緩存穿透 // $redis = \RedisClient::getInstance(); $fangwen = $redis->get($key . '_fangwen'); //只允許50個人 if ($fangwen >= 50) { $this->commonajax1(322); } else { $redis->incr($key . '_fangwen'); } while (1) { $is_lock = \RedisClient::lock($key.'suo', 2); //如果已經搶占鎖了 可以繼續往下執行 if ($is_lock) { break; } } $redis->decr($key . '_fangwen'); $redis = \RedisClient::getInstance(); $result = $redis->get($key); if (empty($result)) { $result = $this->commongetinfo($sql, $zhanwei, $debug); $redis->set($key, serialize($result), $expire); } else { $result = unserialize($result); } \RedisClient::unlock($key.'suo'); return $result; } else { $result = unserialize($result); return $result; } }
ps:我這里限制了搶占鎖的人數 50個人