Redis - 緩存雪崩、緩存擊穿、緩存穿透

1.前言

redis 已經成爲咱們開發中一項必不可少的工具, 本篇主要介紹一下redis 中幾個概念 .redis

2.緩存穿透

概念

緩存穿透是指不斷的請求緩存中不存在的數據, 則全部請求所有落在了數據庫層, 高併發的狀況下, 就直接影響了整個系統的業務, 甚至可能致使系統崩潰

過程

一、根據key從緩存中獲取數據;

    二、若是數據不爲空,直接返回;

    三、若是數據爲空,進行數據庫查詢;

    四、若是從數據庫查詢出的數據不爲空,則放入緩存(設定過時時間)
    
    不斷的重複第三步, 好比要查一個商品的信息, 傳入 `-1`, 全部請求就直接落在了數據庫上

解決

1.設置空對象緩存
    數據庫取出來的數據若是是空值, 一樣也緩存, 可是設置一個比較短的緩存時間, 這樣能夠必定意義上減緩緩存穿透

    2.布隆過濾器
    布隆過濾器本質上一種空間效率極高的機率型算法和數據結構,主要用來判斷一個元素是否在集合中存在。
    
    // 使用
    能夠提早將真實正確的key,在添加完成以後便加入到過濾器當中,每次再進行查詢時,先確認要查詢的key是否在過濾器當中,若是不在,則說明key爲非法key,則不須要進行後續的查詢步驟了。

3.緩存雪崩

概念

緩存雪崩是指緩存中數據大批量同一時間過時或者redis服務掛了,而查詢數據量巨大,引發數據庫壓力過大。

過程

1.商城中緩存了商品的信息,時間爲24小時
    
    2.在次日的0點, 正好有一個搶購活動
    
    3.搶購開始的時候, 所有緩存失效, 同一時間所有的商品信息查詢落到數據庫上, 致使可能壓力過大

解決

1.能夠在作數據緩存的時候, 按分類進行緩存, 添加不一樣的緩存時間
    
    2.緩存的同時, 對緩存時間加上一個隨機數, 以致於不會讓全部緩存同一時間大量失效
    
    3.對於redis服務掛掉的問題,能夠實現redis的高可用主從架構, 而且作redis的持久化, 在redis掛掉的同時時讀取本地緩存數據, 同時恢復redis服務加載持久化的數據

4.緩存擊穿

概念

緩存擊穿和緩存雪崩有點像, 不過不是大面積的緩存失效
緩存擊穿指的是緩存中某一個key的值不斷的接收着大量的請求, 而在這個key值失效的瞬間, 大量的請求落在了數據庫上, 從而致使數據庫可能壓力過大

過程

1.有key1,key2...等鍵值對應的緩存
    
    2.key1屬於熱度商品, 不斷的扛着請求
    
    3.key1過時時間到了, 請求瞬間落在了數據庫上, 致使可能壓力過大

解決

一、加分佈式鎖或者分佈式隊列

用加分佈式鎖或者分佈式隊列的方式保證緩存的單線程寫,從而避免失效時大量的併發請求落到底層存儲系統上。在加鎖方法內先從緩存中再獲取一次(防止另外的線程優先獲取鎖已經寫入了緩存),沒有再查DB寫入緩存。 (固然也能夠: 在沒有獲取鎖的線程中一直輪詢緩存,至超時)

二、添加超時標記

在緩存的對象上增長一個屬性來標識超時時間,當獲取到數據後,校驗數據內部的標記時間,斷定是否快超時了,若是是,異步發起一個線程(控制好併發)去主動更新該緩存。

三、另外還有一個粗暴的方法,若是你的熱點數據要求實時性比較低,那麼能夠設置熱點數據在熱點時段不過時,在訪問低峯期過時,好比天天凌晨過時。
相關文章
相關標籤/搜索