最近面試中遇到redis快取穿透、快取雪崩等問題,特意了解下。
redis快取穿透:
快取穿透是指使用者查詢資料,在資料庫沒有,自然在快取中也不會有。這樣就導致使用者查詢的時候,在快取中找不到,每次都要去資料庫再查詢一遍,然後返回空。這樣請求就繞過快取直接查資料庫,這也是經常提的快取命中率問題。
解決的辦法:
1. 如果查詢資料庫也為空,直接設定乙個預設值存放到快取,後續不會繼續訪問資料庫,同時設定過期時間保證高併發情況下保障不被穿透,後續也能及時更新。
2. 假如key是有一定規則的,可key來過濾一部分無效查詢。
3. 採用布隆過濾器(bloom filter),將所有可能存在的資料雜湊到乙個足夠大的bitset中,不存在的資料將會被攔截掉,從而避免了對底層儲存系統的查詢壓力。
redis快取雪崩:
大併發的快取穿透,導致所有請求都跑去了資料庫,引起資料庫io、記憶體和cpu壓力過大,甚至導致宕機,使得整個系統崩潰,這就是快取雪崩(快取失效)。
解決的辦法:
1. 減少快取穿透的影響。
2. 使用主備機制,redis雙快取涉及到更新事務的問題,需解決update可能讀到髒資料。
redis熱點key:
熱點key:某個key訪問非常頻繁,當key失效的時候有大量執行緒來構建快取,導致負載增加,系統崩潰。
解決辦法:
1. 使用鎖,單機用synchronized,lock等,分布式用分布式鎖。(效能低)
2. 快取過期時間不設定,在key對應的value裡設定過期時間。如果檢測到存的時間超過過期時間則非同步更新快取。
3. 在value設定乙個比過期時間t0小的過期時間值t1,當t1過期的時候,延長t1並做更新快取操作。
推薦使用後倆種模式,雖然需要一定的硬編碼,但不影響效能。
Redis快取穿透 快取雪崩
把redis作為快取使用已經是司空見慣,但是使用redis後也可能會碰到一系列的問題,尤其是資料量很大的時候,經典的幾個問題如下 一 快取和資料庫間資料一致性問題 分布式環境下 單機就不用說了 非常容易出現快取和資料庫間的資料一致性問題,針對這一點的話,只能說,如果你的專案對快取的要求是強一致性的,...
Redis 快取穿透 快取雪崩
目錄 1.快取穿透 如何避免?如何選擇?2 快取擊穿 如何解決 3.快取雪崩 如何解決?快取穿透 一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 一些惡意的請求會故意查詢不存在的key,請求量很大,就會對後端系統造成很大的壓力,或導致資料庫異常。...
redis快取穿透 快取雪崩
什麼是快取雪崩 在同一時間內大量的快取資料失效,大量的請求都會去資料庫查詢,造成快取雪崩。解決方法 這個沒有完美的解決方法,但是可以分析使用者行為,盡量讓失效時間點均勻分布,還有就是在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量,比如對某國key只允許乙個執行緒查詢資料庫和快取,其他...