緩存雪崩,緩存穿透,緩存並發,緩存預熱,緩存算法詳解

概述

今天大概講一下緩存雪崩,緩存穿透,緩存併發,緩存預熱,緩存算法這幾個概念和解決思路。

緩存雪崩,緩存穿透,緩存併發,緩存預熱,緩存算法詳解


1、緩存雪崩

可能是因為數據未加載到緩存中,或者緩存同一時間大面積的失效,從而導致所有請求都去查數據庫,導致數據庫CPU和內存負載過高,甚至宕機。

解決思路:

1.1、加鎖計數(即限制併發的數量,可以用semphore)或者起一定數量的隊列來避免緩存失效時大量請求併發到數據庫。但這種方式會降低吞吐量。

1.2、分析用戶行為,然後失效時間均勻分佈。或者在失效時間的基礎上再加1~5分鐘的隨機數。

1.3、如果是某臺緩存服務器宕機,則考慮做主備。

2、緩存穿透

指用戶查詢數據,在數據庫沒有,自然在緩存中也不會有。這樣就導致用戶查詢的時候,在緩存中找不到,每次都要去數據庫中查詢。

解決思路:

如果查詢數據庫也為空,直接設置一個默認值存放到緩存,這樣第二次到緩衝中獲取就有值了,而不會繼續訪問數據庫。設置一個過期時間或者當有值的時候將緩存中的值替換掉即可。

可以給key設置一些格式規則,然後查詢之前先過濾掉不符合規則的Key。

3、緩存併發

如果網站併發訪問高,一個緩存如果失效,可能出現多個進程同時查詢DB,同時設置緩存的情況,如果併發確實很大,這也可能造成DB壓力過大,還有緩存頻繁更新的問題。

解決思路:

對緩存查詢加鎖,如果KEY不存在,就加鎖,然後查DB入緩存,然後解鎖;其他進程如果發現有鎖就等待,然後等解鎖後返回數據或者進入DB查詢。

4、緩存預熱

目的就是在系統上線前,將數據加載到緩存中。

解決思路:

數據量不大的話,在系統啟動的時候直接加載。

自己寫個簡單的緩存預熱程序。

5、緩存算法

FIFO算法:First in First out,先進先出。原則:一個數據最先進入緩存中,則應該最早淘汰掉。也就是說,當緩存滿的時候,應當把最先進入緩存的數據給淘汰掉。

LFU算法:Least Frequently Used,最不經常使用算法。

LRU算法:Least Recently Used,近期最少使用算法。

LRU和LFU的區別。LFU算法是根據在一段時間裡數據項被使用的次數選擇出最少使用的數據項,即根據使用次數的差異來決定。而LRU是根據使用時間的差異來決定的。


上面的內容是優化需要了解的,對大家以後優化還是有一定幫助的。

後期會分享更多關於優化的內容,有興趣的朋友可以關注下!

緩存雪崩,緩存穿透,緩存併發,緩存預熱,緩存算法詳解


分享到:


相關文章: