redis互斥鎖解決快取穿透問題
阿新 • • 發佈:2020-10-09
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個人