緩存穿透和緩存雪崩

緩存穿透和緩存雪崩mysql

緩存穿透redis

  • 概念 所謂緩存穿透就是說在緩存中不存在,而後直接在數據庫中查詢的現象,圖例以下:

  • 場景 通常來講,緩存穿透的場景發生在故意攻擊的場景下;好比說,原本查詢意見商品的序號是正數,可是請求方老是請求大量的負數過來,致使緩存無效,所有流量都打在了數據庫中,若是某一時刻流量過大,則會致使數據庫崩潰;sql

  • 解決方案數據庫

    • 方案一:布隆過濾器
      • 布隆過濾器會判斷某個元素是否在某個幾個中,相關的知識點會專門去介紹。
    • 方案二:緩存空值
      • 能夠把一些不符合要求的數據的key值設置爲NULL,這樣就不會一直去查數據庫了可是須要設置過時時間; 最好就是在redis前面加一個布隆過濾器,這樣很下降緩存穿透的機率;
  • 僞代碼 ////方案一 //僞碼 string penetrate1(int ID,string str) {緩存

    //使用布隆過濾器,後續專門寫一篇博客
        if(存在)
        {
            redis操做
        }
        else
        {
            return NULL;
        }
        
    }
    ////方案二
    //僞碼
    string penetrate1(int ID,string str)
    {
        //假設能夠就是ID
        int CacheTime = 30;
        string CacheValue;
        char cmd[128];
        char sql[128];
        memset(cmd,0,sizeof(cmd));
        memset(sql,0,sizeof(sql));
        sprintf(cmd,"get %d",ID);
        redisReply* replay = (redisReply*)redisCommand(conn,cmd);
        if(replay->type == REDIS_REPLY_ERROR)
        {
            //查詢數據庫
            mysql_query(&mysql,sql);
            MYSQL_RES *result= mysql_store_result(&mysql);
            int row = mysql_num_rows(result);
            //查詢爲空
            if(row < 0)
            {
                //設置默認值
                memset(cmd,0,sizeof(cmd));
                sprintf(cmd,"set %d ''",ID);
                redisReply* replay = (redisReply*)redisCommand(conn,cmd);
            }
            //數據庫數據同步到redis中
            //set XX XX
            redisReply* replay = (redisReply*)redisCommand(conn,cmd);
            //返回數據
            return 結果;
        }
        else
        {
            return replay->str;
        }
        
        
    
    }   
    複製代碼

緩存雪崩服務器

  • 概念 所謂緩存雪崩就是在某一個時刻,緩存集大量失效。全部流量直接打到數據庫上,對數據庫形成巨大壓力;

  • 場景 基本咱們能想到的場景就是一些電商搶購的現象,通常就是好比12點開始,在1點的時候大量同時失效,這個時候就會形成緩存雪崩的現象;微信

  • 解決方案學習

    • 方案一:加鎖/隊列
      • 加鎖/隊列;這樣雖然能下降數據庫壓力,可是同時,響應也很慢
    • 方案二:緩存標記
      • 給每個緩存數據增長相應的緩存標記,記錄緩存的是否失效,若是緩存標記失效,則更新數據緩存
    • 方案三:緩存過時時間錯開
      • 設置緩存時間錯開,能夠在設置過時時間的時候,加一個必定範圍內的隨機值來錯開

想了解學習更多C++後臺服務器方面的知識,請關注:spa

微信公衆號:====C++後臺服務器開發====code

相關文章
相關標籤/搜索