redis互斥鎖解決緩存雪崩問題


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個人


免責聲明!

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



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