四、快取預熱
五、快取更新
六、資料庫快取如何保證一致性
一、快取雪崩
我們設定快取時採用了相同的過期時間,在同一時刻出現大面積的快取過期。所有原本應該訪問快取的請求都去查詢資料庫了,而對資料庫cpu和記憶體造成巨大壓力,嚴重的會造成資料庫宕機。從而形成一系列連鎖反應,造成整個系統崩潰。
解決:通過加鎖或者佇列來保證對某個key只允許乙個執行緒查詢資料,其他執行緒等待,從而避免失效時大量的併發請求落到資料庫上。(不推薦,執行緒阻塞,使用者體驗差)
為key設定不同的快取失效時間。將快取失效時間分散開,比如我們可以在原有的失效時間基礎上增加乙個隨機值,比如1-5分鐘隨機,這樣每乙個快取的過期時間的重複率就會降低,就很難引發集體失效的事件。
定期重新整理快取。
做二級快取,或者雙快取策略:cache1 為原始快取,cache2 為拷貝快取,cache1 失效時,可以訪問 cache2,cache1 快取失效時間設定為短期,cache2 設定為長期。
將熱key分布在不同的redis上。
設定熱點資料永不過期。
二、快取擊穿
快取擊穿是指快取中的某個熱點key快取時間過期,由於併發使用者特別多,同時快取中讀不到資料,都去資料庫中去讀資料,引起資料庫壓力瞬間增大。
解決:設定熱點資料永不過期
使用互斥機制,加鎖,獲取鎖的才能讀庫。
三、快取穿透
快取穿透是指使用者乙個一定不存在的資料,在資料庫沒有,自然在快取中也不會有。這將導致這個不存在的資料每次請求都要到資料庫去查詢,造成快取穿透。
解決:採用布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bitmap中,乙個一定不存在的資料會被這個bitmap攔截掉,從而避免了對底層儲存系統的查詢壓力。
如果乙個查詢返回的資料為空(不管是資料不存在,還是系統故障),我們仍然把這個空結果進行快取,但它的過期時間會很短,最長不超過五分鐘。通過這個直接設定的預設值存放到快取,這樣第二次到緩衝中獲取就有值了,而不會繼續訪問資料庫。
快取空物件帶來的問題:
空值做了快取,意味著快取中存了更多的鍵,需要更多的記憶體空間,比較有效的方法是針對這類資料設定乙個較短的過期時間,讓其自動剔除。
快取和儲存的資料會有一段時間視窗的不一致,可能會對業務有一定影響。例如:過期時間設定為 5分鐘,如果此時儲存新增了這個資料,那此段時間就會出現快取和儲存資料的不一致,此時可以利用訊息系統或者其他方式清除掉快取層中的空物件。
四、快取預熱
直接寫個快取重新整理頁面,上線時手工操作下;
資料量不大,可以在專案啟動的時候自動進行載入;
定時重新整理快取;
五、快取更新
除了快取伺服器自帶的快取失效策略之外(redis預設的有6中策略可供選擇),我們還可以根據具體的業務需求進行自定義的快取淘汰,常見的策略有兩種:
(1)定時去清理過期的快取;
(2)當有使用者請求過來時,再判斷這個請求所用到的快取是否過期,過期的話就去底層系統得到新資料並更新快取。
兩者各有優劣,第一種的缺點是維護大量快取的key是比較麻煩的,第二種的缺點就是每次使用者請求過來都要判斷快取失效,邏輯相對比較複雜!具體用哪種方案,大家可以根據自己的應用場景來權衡。
六、資料庫快取如何保證一致性
1.先操作快取,再運算元據庫
先更新快取,再更新資料庫,併發場景下可能會導致快取和資料庫不一致
先刪除快取,再更新資料庫,併發場景下可能會導致快取和資料庫不一致
2.先運算元據庫,再操作快取
先更新資料庫再更新快取,併發場景下可能會導致資料不一致
先更新資料庫,再刪除快取,併發場景下也可能導致資料不一致,但是機率比較小。
不過,實際上出現的概率可能非常低,因為這種情況發生需要兩個條件
3. 讀快取時快取失效,而且併發著有乙個寫操作。
4. 而讀操作必需在寫操作前進入資料庫操作,而又晚於寫操作更新快取。而實際上資料庫的寫操作會比讀操作慢得多,而且還要鎖表,所有的這些條件都具備的概率基本並不大。
更新資料庫成功,刪除快取失敗怎麼辦
將想要刪除的key放進了訊息佇列,
訊息佇列的消費端收到這個key的時候就執行刪除快取中對應key的操作
設定重試刪除操作,超過最大重試次數(比如5次)後將就報警給運維人員
另外快取有效期不要設定過長。
還可以設定定時任務重新整理快取。
參考訊息佇列的重試機制
分布式 2分布式事務
分布式 1概述cap和base 分布式 2分布式事務 分布式 3分布式一致性演算法 分布式 4集群 分布式 5服務限流演算法 分布式 6分布式id 分布式 7效能壓測 分布式 8日誌鏈路跟蹤 分布式 9分布式鎖 redis鎖的幾種實現 參考 分布式系統間各種問題 宕機 網路不穩定 本地事務無法滿足需...
分布式隨筆1 分布式概述
分布式,好寬泛的話題,來來咱扯兩句。你乙個人再強壯,也扛不了100袋大公尺,單機的資源也很有限,大 的大資料量 高併發以及各種業務需求 童鞋們的web應用,伺服器 rdb mq 服務 快取以及各類基礎設施,更別說還有安全 大資料方面的需求 於是,我們常見的面向服務的dubbo springcloud...
中介軟體 1 分布式快取
原文 中介軟體 1 分布式快取 為了提高 效能,一般都會使用到快取,快取的資料來源包括資料庫,外部介面等,快取一般分為兩種,本地快取和分布式快取,這裡主要總結的是分布式快取。最常用的分布式快取是redis和memcached,它們都是分布式快取技術中的一種,可能大部分的開發人員都聽說或者接觸過,但是...