久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何解決redis緩存穿透、緩存擊穿、緩存雪崩的問題

149次閱讀
沒有評論

共計 2845 個字符,預計需要花費 8 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

這篇文章主要介紹了如何解決 redis 緩存穿透、緩存擊穿、緩存雪崩的問題,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。

緩存穿透:key 中對應的緩存數據不存在,導致去請求數據庫,造成數據庫的壓力倍增的情況

緩存擊穿:redis 過期后的一瞬間,有大量用戶請求同一個緩存數據,導致這些請求都去請求數據庫,造成數據庫壓力倍增的情,針對一個 key 而言

緩存雪崩:緩存服務器宕機或者大量緩存集中某個時間段失效,導致請求全部去到數據庫,造成數據庫壓力倍增的情況,這個是針對多個 key 而言

一、緩存穿透的解決方案

常用方法可以采用布隆過濾器方法進行數據攔截,其次可以還有一種解決思路,就是如果請求的數據為空,將空值也進行緩存,就不會發生穿透情況

?php
class getPrizeList {
 /**
 * redis 實例
 * @var \Redis
 */
 private $redis;
 /**
 * @var string
 */
 private $redis_key =  |prize_list 
 /**
 *  過期時間
 * @var int
 */
 private $expire = 30;
 /**
 * getPrizeList constructor.
 * @param $redis
 */
 public function __construct($redis)
 {
 $this- redis = $redis;
 }
 /**
 * @return array|bool|string
 */
 public function fetch()
 { $result = $this- redis- get($this- redis_key);
 if(!isset($result)) {
 // 此處應該進行數據庫查詢...
 // 如果查詢結果不存在,給其默認空數組進行緩存
 $result = [];
 $this- redis- set($this- redis_key, $result, $this- expire);
 }
 return $result;
 }
}

二、緩存擊穿解決辦法

使用互斥鎖 (mutex key), 就是一個 key 過期時,多個請求過來允許其中一個請求去操作數據庫,其他請求等待第一個請求成功返回結果后再請求。

?php
class getPrizeList {
 /**
 * redis 實例
 * @var \Redis
 */
 private $redis;
 /**
 * @var string
 */
 private $redis_key =  |prize_list 
 /**
 * @var string
 */
 private $setnx_key =  |prize_list_setnx 
 /**
 *  過期時間
 * @var int
 */
 private $expire = 30;
 /**
 * getPrizeList constructor.
 * @param $redis
 */
 public function __construct($redis)
 {
 $this- redis = $redis;
 }
 /**
 * @return array|bool|string
 */
 public function fetch()
 { $result = $this- redis- get($this- redis_key);
 if(!isset($result)) { if($this- redis- setnx($this- setnx_key, 1, $this- expire)) {
 // 此處應該進行數據庫查詢...
 //$result =  數據庫查詢結果;
 $this- redis- set($this- redis_key, $result, $this- expire);
 $this- redis- del($this- setnx_key); // 刪除互斥鎖
 } else {
 // 其他請求每等待 10 毫秒重新請求一次
 sleep(10);
 self::fetch();
 }
 }
 return $result;
 }
}

三、緩存雪崩的解決辦法

這種情況是因為多個 key 同時過期導致的數據庫壓力,一種方法可以在 key 過期時間基礎上增加時間隨機數,讓過期時間分散開,減少緩存時間過期的重復率

另一種方法就是加鎖排隊,這種有點像上面緩存擊穿的解決方式,但是這種請求量太大,比如 5000 個請求過來,4999 個都需要等待,這必然是指標不治本,不僅用戶體驗性差,分布式環境下就更加復雜,因此在高并發場景下很少使用

最好的解決方法,是使用緩存標記,判斷該標記是否過期,過期則去請求數據庫,而緩存數據的過期時間要設置的比緩存標記的長,這樣當一個請求去操作數據庫的時候,其他請求拿的是上一次緩存數據

?php
class getPrizeList {
 /**
 * redis 實例
 * @var \Redis
 */
 private $redis;
 /**
 * @var string
 */
 private $redis_key =  |prize_list 
 /**
 *  緩存標記 key
 * @var string
 */
 private $cash_key =  |prize_list_cash 
 /**
 *  過期時間
 * @var int
 */
 private $expire = 30;
 /**
 * getPrizeList constructor.
 * @param $redis
 */
 public function __construct($redis)
 {
 $this- redis = $redis;
 }
 /**
 * @return array|bool|string
 */
 public function fetch()
 { $cash_result = $this- redis- get($this- cash_key);
 $result = $this- redis- get($this- redis_key);
 if(!$cash_result) { $this- redis- set($this- cash_key, 1, $this- expire);
 // 此處應該進行數據庫查詢...
 //$result =  數據庫查詢結果,  并且設置的時間要比 cash_key 長,這里設置為 2 倍;
 $this- redis- set($this- redis_key, $result, $this- expire * 2);
 }
 return $result;
 }
}

感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“如何解決 redis 緩存穿透、緩存擊穿、緩存雪崩的問題”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!

向 AI 問一下細節

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-04發表,共計2845字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 屯门区| 岳池县| 利川市| 周宁县| 鹤岗市| 昭苏县| 平果县| 平度市| 正镶白旗| 永寿县| 凌海市| 武城县| 南安市| 呼图壁县| 万荣县| 德令哈市| 布拖县| 鞍山市| 海丰县| 宿迁市| 汉阴县| 丰都县| 如东县| 丰县| 贺兰县| 乌鲁木齐市| 无锡市| 鲜城| 琼中| 邢台县| 紫阳县| 南木林县| 饶阳县| 青州市| 阿拉尔市| 西和县| 西城区| 方城县| 游戏| 姜堰市| 临邑县|