站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        一起學習 Redis緩存穿透、緩存擊穿、緩存雪崩的原理和解決辦法

        一起學習 Redis緩存穿透、緩存擊穿、緩存雪崩的原理和解決辦法

        推薦(免費):redis

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

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

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

        一、緩存穿透的解決方案

        • 常用方法可以采用布隆過濾器方法進行數(shù)據(jù)攔截,其次可以還有一種解決思路,就是如果請求的數(shù)據(jù)為空,將空值也進行緩存,就不會發(fā)生穿透情況
        <?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)) {             //此處應該進行數(shù)據(jù)庫查詢...             //如果查詢結(jié)果不存在,給其默認空數(shù)組進行緩存             $result = [];             $this->redis->set($this->redis_key, $result, $this->expire);         }          return $result;     } }

        二、緩存擊穿解決辦法

        • 使用互斥鎖(mutex key),就是一個key過期時,多個請求過來允許其中一個請求去操作數(shù)據(jù)庫,其他請求等待第一個請求成功返回結(jié)果后再請求。
        <?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)) {                 //此處應該進行數(shù)據(jù)庫查詢...                 //$result = 數(shù)據(jù)庫查詢結(jié)果;                 $this->redis->set($this->redis_key, $result, $this->expire);                 $this->redis->del($this->setnx_key); //刪除互斥鎖             } else {                 //其他請求每等待10毫秒重新請求一次                 sleep(10);                 self::fetch();             }         }          return $result;     } }

        三、緩存雪崩的解決辦法

        • 這種情況是因為多個key同時過期導致的數(shù)據(jù)庫壓力,一種方法可以在key過期時間基礎(chǔ)上增加時間隨機數(shù),讓過期時間分散開,減少緩存時間過期的重復率
        • 另一種方法就是加鎖排隊,這種有點像上面緩存擊穿的解決方式,但是這種請求量太大,比如5000個請求過來,4999個都需要等待,這必然是指標不治本,不僅用戶體驗性差,分布式環(huán)境下就更加復雜,因此在高并發(fā)場景下很少使用
        • 最好的解決方法,是使用緩存標記,判斷該標記是否過期,過期則去請求數(shù)據(jù)庫,而緩存數(shù)據(jù)的過期時間要設(shè)置的比緩存標記的長,這樣當一個請求去操作數(shù)據(jù)庫的時候,其他請求拿的是上一次緩存數(shù)據(jù)
        <?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);             //此處應該進行數(shù)據(jù)庫查詢...             //$result = 數(shù)據(jù)庫查詢結(jié)果, 并且設(shè)置的時間要比cash_key長,這里設(shè)置為2倍;             $this->redis->set($this->redis_key, $result, $this->expire * 2);         }          return $result;     } }

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 久久青青草原精品国产软件| 国产精品熟女一区二区| 久久精品水蜜桃av综合天堂| 国产精品视频全国免费观看| 国产精品亲子乱子伦xxxx裸| 无码国内精品久久人妻麻豆按摩| 桃花岛精品亚洲国产成人| 国产国拍亚洲精品mv在线观看| 最新精品国偷自产在线| 日本精品一区二区三区在线视频 | 久久青青草原精品国产软件| 99在线精品免费视频| 久久九九亚洲精品| 国产精品免费高清在线观看| 亚洲国产精品国自产拍AV| 亚洲国产欧美日韩精品一区二区三区| 精品第一国产综合精品蜜芽| 国产欧美日韩综合精品一区二区三区 | 欧美精品一区二区久久| 国产精品麻豆欧美日韩ww| 四虎成人精品免费影院| 国产精品亚洲欧美一区麻豆 | 久久精品无码一区二区无码| 午夜精品久久久久久毛片| 亚洲无线观看国产精品| 最新国产精品拍自在线播放| 亚洲国产精品成人| 真实国产乱子伦精品一区二区三区| 免费精品精品国产欧美在线 | 人人妻人人澡人人爽人人精品 | 最新国产精品无码| 亚洲日韩一页精品发布| 中文字幕在线精品视频入口一区| 成人亚洲日韩精品免费视频| 网友偷拍日韩精品| 久久久精品无码专区不卡| 国产综合色产在线精品| 精品无码人妻久久久久久| 欧美国产成人精品一区二区三区| 亚洲午夜精品一级在线播放放| 亚洲日韩精品射精日|