Redis快取溢位處理

2021-10-04 10:54:53 字數 2420 閱讀 4635

快取系統,按照key去查詢value,當key對應的value一定不存在的時候並對key併發請求量很大的時候,就會對後端造成很大的壓力。

(查詢乙個必然不存在的資料。比如文章表,查詢乙個不存在的id,每次都會訪問db,如果有人惡意破壞,很可能直接對db造成影響。)

由於快取不命中,每次都要查詢持久層。從而失去快取的意義。

解決方法:

2、將資料庫中所有的查詢條件,放到布隆過濾器中。當乙個查詢請求來臨的時候,先經過布隆過濾器進行檢查,如果請求存在這個條件中,那麼繼續執行,如果不在,直接丟棄。

備註:比如資料庫中有10000個條件,那麼布隆過濾器的容量size設定的要稍微比10000大一些,比如12000.

對於誤判率的設定,根據實際專案,以及硬體設施來具體決定。但是一定不能設定為0,並且誤判率設定的越小,雜湊函式跟陣列長度都會更多跟更長,那麼對硬體,記憶體中間的要求就會相應的高。

private static bloomfilterbloomfilter = bloomfilter.create(funnels.integerfunnel(), size, 0.0001); 

有了size跟誤判率,那麼布隆過濾器就會產生相應的雜湊函式跟陣列。

綜上:我們可以利用布隆過濾器,將redis快取擊穿控制在乙個可容忍的範圍內。

如果快取集中在一段時間內失效,發生大量的快取穿透,所有的查詢都落在資料庫上,造成了快取雪崩。

快取層宕掉後,流量會像奔逃的野牛一樣,打向後端儲存

解決方法:

在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許乙個執行緒查詢資料和寫快取,其他執行緒等待。

可以通過快取reload機制,預先去更新快取,再即將發生大併發訪問前手動觸發載入快取

不同的key,設定不同的過期時間,讓快取失效的時間點盡量均勻

做二級快取,或者雙快取策略。a1為原始快取,a2為拷貝快取,a1失效時,可以訪問a2,a1快取失效時間設定為短期,a2設定為長期。

(1) 這個key是乙個熱點key(例如乙個重要的新聞,乙個熱門的八卦新聞等等),所以這種key訪問量可能非常大。

(2) 快取的構建是需要一定時間的。(可能是乙個複雜計算,例如複雜的sql、多次io、多個依賴(各種介面)等等)

於是就會出現乙個致命問題:在快取失效的瞬間,有大量執行緒來構建快取(見下圖),造成後端負載加大,甚至可能會讓系統崩潰 。

解決方法:

1. 使用互斥鎖(mutex key):這種解決方案思路比較簡單,就是只讓乙個執行緒構建快取,其他執行緒等待構建快取的執行緒執行完,重新從快取獲取資料就可以了

2. "提前"使用互斥鎖(mutex key):在value內部設定1個超時值(timeout1), timeout1比實際的memcache timeout(timeout2)小。當從cache讀取到timeout1發現它已經過期時候,馬上延長timeout1並重新設定到cache。然後再從資料庫載入資料並設定到cache中。

3. "永遠不過期":

這裡的「永遠不過期」包含兩層意思:

(1) 從redis上看,確實沒有設定過期時間,這就保證了,不會出現熱點key過期問題,也就是「物理」不過期。

(2) 從功能上看,如果不過期,那不就成靜態的了嗎?所以我們把過期時間存在key對應的value裡,如果發現要過期了,通過乙個後台的非同步執行緒進行快取的構建,也就是「邏輯」過期

4. 資源保護:可以做資源的隔離保護主線程池,如果把這個應用到快取的構建也未嘗不可。

四種方案對比:

作為乙個併發量較大的網際網路應用,我們的目標有3個:

1. 加快使用者訪問速度,提高使用者體驗。

2. 降低後端負載,保證系統平穩。

3. 保證資料「盡可能」及時更新(要不要完全一致,取決於業務,而不是技術。)

所以第二節中提到的四種方法,可以做如下比較,還是那就話:沒有最好,只有最合適。 

解決方案

優點缺點

簡單分布式鎖(tim yang)

1. 思路簡單

2. 保證一致性

1. **複雜度增大

2. 存在死鎖的風險

加另外乙個過期時間(tim yang)

1. 保證一致性

同上 不過期(本文)

1. 非同步構建快取,不會阻塞執行緒池

1. 不保證一致性。

2. **複雜度增大(每個value都要維護乙個timekey)。

3. 占用一定的記憶體空間(每個value都要維護乙個timekey)。

資源隔離元件hystrix(本文)

1. hystrix技術成熟,有效保證後端。

2. hystrix監控強大。

1. 部分訪問存在降級策略。 

總結1.  熱點key + 過期時間 + 複雜的構建快取過程 => mutex key問題

2. 構建快取乙個執行緒做就可以了。

3. 四種解決方案:沒有最佳只有最合適。

懂的越多,不會的也就越多,知識之路是不斷進取的

CSS溢位處理

css定義中的overflow屬性,封裝了溢位處理的這個概念。在盒子模型中的代表標籤的矩形物件,可以通過css樣式來定義內容區域的高度與寬度,當這個內容無法容納子矩形物件時,對於這些子矩形物件必須決定怎麼顯示,顯示什麼,這樣的處理規則就稱為溢位處理。瀏覽器在做顯示運算的時候,會依照溢位處理,來計算內...

內容溢位處理

單行內容 width 100px whitespace nowrap overflow hidden text overflow ellipsis 前提 固定內容容器寬度 要求 1 禁止文字換行 whitespace nowrap 2 讓溢位文字隱藏 overflow hidden 此處設定了寬度方...

html文字溢位處理

在前端開發的實際操作中,我們在寫頁面遇到此類問題時直接複製下列 使用即可.單行文字省略超出部分,顯示省略號 overflow hidden 超出部分隱藏 text overflow ellipsis 超出部分以省略號顯示 white space nowrap 超出部分強制不換行多行文字省略超出部分,...