什麼是緩存雪崩數據庫
若是緩存集中在一段時間內失效,發生大量的緩存穿透,全部的查詢都落在數據庫上,形成了緩存雪崩。 因爲原有緩存失效,新緩存未到期間全部本來應該訪問緩存的請求都去查詢數據庫了,而對數據 庫CPU和內存形成巨大壓力,嚴重的會形成數據庫宕機
你有什麼解決方案來防止緩存雪崩?數組
加鎖排隊緩存
首先多個請求同時緩存,若是有數據直接返回;沒有的話其中一個線程獲取鎖去訪問數據庫,查到數據,回設緩存,釋放鎖,而後其餘請求直接取緩存裏的數據
數據預熱服務器
緩存預熱就是系統上線後,將相關的緩存數據直接加載到緩存系統。這樣就能夠避免在 用戶請求的時候,先查詢數據庫,而後再將數據緩存的問題!用戶直接查詢事先被預熱的 緩存數據!能夠經過緩存reload機制,預先去更新緩存,再即將發生大併發訪問前手動觸 發加載緩存不一樣的key
雙層緩存策略(不多使用)數據結構
C1爲原始緩存,C2爲拷貝緩存,C1失效時,能夠訪問C2,C1緩存失效時間設置爲短時間,C2設置爲長期。 定時更新緩存策略失效性要求不高的緩存,容器啓動初始化加載,採用定時任務更新或移除緩存 設置不一樣的過時時間,讓緩存失效的時間點儘可能均勻
什麼是緩存穿透?併發
緩存穿透是指用戶查詢數據,在數據庫沒有,天然在緩存中也不會有。這樣就致使用戶查詢的時候,在緩存中找不到對應key的value,每次都要去數據庫再查詢一遍,而後返回空(至關於進行了兩次 無用 的查詢)。這樣請求就繞過緩存直接查數據庫
你有什麼解決方案來防止緩存穿透?函數
採用布隆過濾器BloomFilter線程
將全部可能存在的數據哈 希到一個足夠大的 bitmap 中,一個必定不存在的數據會被這個 bitmap 攔截掉,從而避免了對底層存儲系統的查詢壓力
緩存空值3d
若是一個查詢返回的數據爲空(不論是數據不存在,仍是系統故障)咱們仍然把這個空結果進行 緩存,但它的過時時間會很短,最長不超過五分鐘。經過這個直接設置的默認值存放到緩存, 這樣第二次到緩衝中獲取就有值了,而不會繼續訪問數據庫
什麼是布隆過濾器?code
本質上布隆過濾器是一種數據結構,比較巧妙的機率型數據結構(probabilistic data structure),特色是高效地插入和查詢,能夠用來告訴你 「某樣東西必定不存在或者可能存在」。 相比於傳統的 List、Set、Map 等數據結構,它更高效、佔用空間更少,可是缺點是其返回的結果是機率性的,而不是確切的。
布隆過濾器爲何不使用HashMap?
講述布隆過濾器的原理以前,咱們先思考一下,一般你判斷某個元素是否存在用的是什麼?應該蠻多人回答 HashMap 吧,確實能夠將值映射到 HashMap 的 Key,而後能夠在 O(1) 的時間複雜度內返回結果,效率奇高。可是 HashMap 的實現也有缺點,例如存儲容量佔比高,考慮到負載因子的存在,一般空間是不能被用滿的,而一旦你的值不少例如上億的時候,那 HashMap 佔據的內存大小就變得很可觀了。 還好比說你的數據集存儲在遠程服務器上,本地服務接受輸入,而數據集很是大不可能一次性讀進內存構建 HashMap 的時候,也會存在問題。
布隆過濾器原理?
布隆過濾器是一個 bit 向量或者說 bit 數組。
當咱們要映射一個值到布隆過濾器時,先經過多個不一樣的哈希函數生成多個哈希值,並把對應哈希值的位置設爲1。以下:
當咱們再次映射一個值到布隆過濾器
此時5這個位置被映射了兩次,此時假設當咱們查詢「阿豬」這個值是否存在,返回了四、五、6三個值,結果6這個位置沒有被映射過,因此可斷定「必定不存在」;再假設咱們查詢「阿雞」,返回了三、四、5三個值,此時也不能夠判斷爲存在,只能說明「可能存在」。