Redis緩存問題解析

Redis緩存篇

一、爲什麼使用緩存?

Redis作爲內存型的非關係型數據庫,每秒可以支撐更大的讀寫操作。(Redis官網測試讀寫能到10萬左右,是不是很吸引人?)

二、使用緩存的好處

緩存可以解決大訪問量下的數據庫產生的壓力。

三、緩存可能出現的問題

1)緩存穿透

描述: 緩存穿透是指緩存和數據庫中都沒有的數據,而用戶不斷髮起請求,如發起爲id爲“-1”的數據或id爲特別大不存在的數據。這時的用戶很可能是攻擊者,攻擊會導致數據庫壓力過大。比如id的範圍是1~10000,有用戶惡意訪問id<1和id>10000 的記錄,但是這些記錄在數據表中也不存在。
解決方案:
1、可以進行邏輯判斷,比如id<=0,直接返回,因爲數據中的id都是大於0的
2、對不存在的數據,設置值爲空。
3、布隆過濾器,在業務系統和緩存直接增加布隆過濾器,當請求過來時,先通過布隆過濾器判斷(有一定的誤差),存在則繼續進行,不存在直接返回。

優缺點:
添加空數據,會造成大量無用的鍵值。當添加的數據是之前不存在的數據時,會產生數據不一致(可以在設置一個較短的過期時間,但是不推薦或者添加數據後更新緩存)。
布隆過濾器,會產生可容忍的誤差,這種方法適用於數據命中不高,數據相對固定實時性低(通常是數據集較大)的應用場景,代碼維護較爲複雜,但是緩存空間佔用少。

2) 緩存擊穿

描述:
緩存擊穿是指緩存中沒有但數據庫中有的數據(一般是緩存時間到期),這時由於併發用戶特別多,同時讀緩存沒讀到數據,又同時去數據庫去取數據,引起數據庫壓力瞬間增大,造成過大壓力。比如熱搜,商品秒殺等。
解決方案:
1、設置隨機過期時間。
2、加鎖。當熱點過期,又恰好訪問時,通過加鎖的方式只讓一個請求訪問數據庫,然後設置緩存。需要注意的是,在獲取鎖之後,建議再訪問一次緩存。訪問緩存–>加鎖–>再訪問一次緩存–>訪問數據庫–>設置緩存
3、永不過期,即不設置過期時間(但是熱點數據更新時,在重建緩存時會造成數據不一致)

3)緩存雪崩

描述:
緩存雪崩是指緩存中緩存得數據大批量過期,而查詢數據量巨大,引起數據庫壓力過大甚至宕機。和緩存擊穿不同的是,緩存擊穿指併發查同一條數據,緩存雪崩是大面的key失效,導致請求直接打到了數據庫。
解決方案:
1、緩存數據的過期時間設置隨機,防止同一時間大量數據過期現象發生。
2、如果緩存數據庫是分佈式部署,將熱點數據均勻分佈在不同的緩存數據庫中。
3、設置熱點數據永遠不過期。

小結

緩存雪崩: 大量有效數據的緩存過期
緩存穿透: 請求了一個緩存和數據庫都不存在的數據。(惡意訪問不存在的數據)
緩存擊穿: 請求了一個數據庫存在的數據,但是緩存中過期了,導致請求該數據的大量QPS打到了數據庫上面。(熱搜,秒殺)

PS: 緩存用好了就是穿了漂亮衣服,用不好就是果奔。哈哈哈嗝。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章