3. 快取雪崩
4. 快取擊穿
使用redis快取訪問過程如下:
應用訪問redis快取,如果redis快取中資料存在,直接從快取中返回資料。
如果快取中不存在資料,會直接訪問資料庫,同時把資料寫進redis快取,下次訪問就可以直接從redis快取中讀取資料。
訪問乙個不存在的資料,快取會不起作用,請求會直接訪問資料庫,由於資料庫中也不存在該資料,也不會寫入快取中,這將導致每次訪問的時候都會請求資料庫,給資料庫造成很大壓力。
快取空物件
當訪問乙個不存在的資料的時候,即使資料庫返回的是乙個空物件,也將這個空物件快取起來,同時設定乙個過期時間,之後再訪問該資料直接從快取中獲取。
雖然快取空物件能夠解決快取穿透的問題,但是這種方法本身也存在著兩個問題:
將空值快取起來,會占用更多的空間;
雖然對空值設定了過期時間,但是快取中的資料和資料庫中的資料還是會在過期時間內存在不一致,會影響到那些需要保持一致性的業務。
過濾請求
可以先對請求進行過濾,如果該請求訪問的資料不存在,就不用繼續訪問,這樣就可以攔截大量請求。常用布隆過濾器進行過濾。
快取層如果由於某些原因(比如大量的key設定了相同的過期時間),不能提供快取服務,所有的請求都會直接到達資料庫,過大的請求量可能導致資料庫掛掉。
保證快取服務高可用
既然快取服務可能由於某些原因無法提供快取服務,那麼就同時使用多台快取服務裝置,當其中某些節點不能提供服務的時候,其他節點頂上來。
限流降級
當快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。
資料預熱
在正式部署之前,先把可能的資料訪問一遍,將可能大量訪問的資料載入到快取中。在發生大併發訪問前,手動觸發載入快取不同的key,設定不同的過期時間,讓快取失效的時間點盡量均勻。
乙個存在的資料,在快取過期的一刻,同時有大量訪問請求,這些請求會穿過快取直接去訪問資料庫,造成瞬時資料庫請求量過大。
同步鎖
使用同步鎖,保證在多使用者同時請求時,第乙個進入的執行緒去查詢資料庫並寫入快取,其它執行緒在第乙個進入執行緒結束後,從快取中讀取資料即可。
後台定時維護
不設定快取過期時間,由後台建立定時任務去維護快取資料,當大量訪問請求發生時,直接從快取中獲取資料。
redis 快取穿透與快取雪崩
快取穿透 快取系統,按照 key去查詢 value,當key 對應的value 一定不存在的時候並對 key併發請求量很大的時候,就會對後端造成很大的壓力。如何避免 1.對查詢機構為空的情況也進行快取,快取的時間設定端一點,或者對該 key對應的資料 insert 之後清理快取。2.對一定不存在的 ...
Redis快取穿透 快取雪崩
把redis作為快取使用已經是司空見慣,但是使用redis後也可能會碰到一系列的問題,尤其是資料量很大的時候,經典的幾個問題如下 一 快取和資料庫間資料一致性問題 分布式環境下 單機就不用說了 非常容易出現快取和資料庫間的資料一致性問題,針對這一點的話,只能說,如果你的專案對快取的要求是強一致性的,...
Redis 快取穿透 快取雪崩
目錄 1.快取穿透 如何避免?如何選擇?2 快取擊穿 如何解決 3.快取雪崩 如何解決?快取穿透 一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 一些惡意的請求會故意查詢不存在的key,請求量很大,就會對後端系統造成很大的壓力,或導致資料庫異常。...