1. 程式人生 > >快取失效、快取穿透、快取併發及其解決方案

快取失效、快取穿透、快取併發及其解決方案

1. 快取失效

問題描述:  

       引起這個原因的主要因素是高併發下,我們一般設定一個快取的過期時間時,可能有一些會設定5分鐘啊,10分鐘這些;併發很高時可能會出在某一個時間同時生成了很多的快取,並且過期時間在同一時刻,這個時候就可能引發——當過期時間到後,這些快取同時失效,請求全部轉發到DB,DB可能會壓力過重。

處理方法:

    一個簡單方案就是將快取失效時間分散開,不要所以快取時間長度都設定成5分鐘或者10分鐘;比如我們可以在原有的失效時間基礎上增加一個隨機值,比如1-5分鐘隨機,這樣每一個快取的過期時間的重複率就會降低,就很難引發集體失效的事件。

       快取失效時產生的雪崩效應,將所有請求全部放在資料庫上,這樣很容易就達到資料庫的瓶頸,導致服務無法正常提供。儘量避免這種場景的發生。

2. 快取穿透

問題描述:  

      指查詢一個一定不存在的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。

  當在流量較大時,出現這樣的情況,一直請求DB,很容易導致服務掛掉。

處理方法:

  • 方法1.在封裝的快取SET和GET部分增加個步驟,如果查詢一個KEY不存在,就已這個KEY為字首設定一個標識KEY;以後再查詢該KEY的時候,先查詢標識KEY,如果標識KEY存在,就返回一個協定好的非false或者NULL值,然後APP做相應的處理,這樣快取層就不會被穿透。當然這個驗證KEY的失效時間不能太長。
  • 方法2.如果一個查詢返回的資料為空(不管是資料不存在,還是系統故障),我們仍然把這個空結果進行快取,但它的過期時間會很短,一般只有幾分鐘。
  • 方法3.採用布隆過濾器,將所有可能存在的資料雜湊到一個足夠大的bitmap中,一個一定不存在的資料會被這個bitmap攔截掉,從而避免了對底層儲存系統的查詢壓力。

3. 快取併發

問題描述:

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

處理方法:

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

相關推薦

快取失效快取穿透快取併發及其解決方案

1. 快取失效 問題描述:          引起這個原因的主要因素是高併發下,我們一般設定一個快取的過期時間時,可能有一些會設定5分鐘啊,10分鐘這些;併發很高時可能會出在某一個時間同時生成了很多的快取,並且過期時間在同一時刻,這個時候就可能引發——當過期時間到後,這些

25-02併發場景下的快取+資料庫雙寫不一致問題分析與解決方案設計

馬上開始去開發業務系統, 從哪一步開始做,從比較簡單的那一塊開始做,實時性要求比較高的那塊資料的快取去做, 實時性比較高的資料快取,選擇的就是庫存的服務, 庫存可能會修改,每次修改都要去更新這個快取資料; 每次庫存的資料,在快取中一旦過期,或者是被清理掉了,前端的nginx服務都會發送請

併發場景下的快取+資料庫雙寫不一致問題分析與解決方案

1、最初級的快取不一致問題以及解決方案問題:先修改資料庫,再刪除快取,如果刪除快取失敗了,那麼會導致資料庫中是新資料,快取中是舊資料,資料出現不一致。解決思路:先刪除快取,再修改資料庫,如果刪除快取成功了,如果修改資料庫失敗了,那麼資料庫中是舊資料,快取中是空的,那麼資料不會

併發場景下的快取 資料庫雙寫不一致問題分析與解決方案設計

馬上開始去開發業務系統 從哪一步開始做,從比較簡單的那一塊開始做,實時性要求比較高的那塊資料的快取去做 實時性比較高的資料快取,選擇的就是庫存的服務 庫存可能會修改,每次修改都要去更新這個快取資料; 每次庫存的資料,在快取中一旦過期,或者是被清理掉了,前端的ngin

【高併發簡單解決方案】redis快取佇列+mysql 批量入庫+php離線整合

需求背景:有個呼叫統計日誌儲存和統計需求,要求儲存到mysql中;儲存資料高峰能達到日均千萬,瓶頸在於直接入庫併發太高,可能會把mysql幹垮。 問題分析 思考:應用網站架構的衍化過程中,應用最新的框架和工具技術固然是最優選擇;但是,如果能在現有的框架的基礎上提

【高併發簡單解決方案】redis佇列快取 + mysql 批量入庫 + php離線整合--轉載

轉載自::轉載需求背景:有個呼叫統計日誌儲存和統計需求,要求儲存到mysql中;儲存資料高峰能達到日均千萬,瓶頸在於直接入庫併發太高,可能會把mysql幹垮。問題分析思考:應用網站架構的衍化過程中,應用最新的框架和工具技術固然是最優選擇;但是,如果能在現有的框架的基礎上提出簡

併發場景下快取+資料庫雙寫不一致問題分析與解決方案設計

能堅持別人不能堅持的,才能擁有別人不能擁有的。   文章首發於左上角公眾號,同步到部落格園會延遲一到兩天。 關注程式設計大道公眾號,讓我們一同堅持心中所想,一起成長!! Redis是企業級系統高併發、高可用架構中非常重要的一個環節。Redis主要解決了關係型資料庫併發量低的問題,有助於緩

緩存穿透緩存擊穿緩存雪崩及其解決方案

信息 不存在 相同 但是 崩潰 存儲 搜索 普通 攻擊 1.緩存穿透   緩存穿透是指查詢一個一定不存在的數據,因為緩存中也無該數據的信息,則會直接去數據庫層進行查詢,從系統層面來看像是穿透了緩存層直接達到DB,從而稱為緩存穿透,沒有了緩存層的保護,這種查詢一定不存在的數據

【Java基礎知識】switch表示式case穿透defaultswitch結束條件

switch(表示式) {case 值1:      語句體1;break;case 值2:      語句體2;break;...default:      語句體n+1;break; } 1、格式解釋說明:switch表示式:可以是byte,short,int,char

「mysql優化專題」高可用性負載均衡的mysql集群解決方案(12)

格式 return 建議 處理方式 sage 主機 等待 status 深度 一、為什麽需要mysql集群? 一個龐大的分布式系統的性能瓶頸中,最脆弱的就是連接。連接有兩個,一個是客戶端與後端的連接,另一個是後端與數據庫的連接。簡單如圖下兩個藍色框框(其實,這張圖是我在悟空

Redis 中哨兵sentinel 機制從宕機及恢復主庫宕機及恢復解決方案

目錄 什麼是哨兵 原理 環境 設定哨兵 從宕機及恢復 主宕機及恢復 配置多個哨兵 1、什麼是哨兵 哨兵是對Redis的系統的執行情況的監控,它是一個獨立程序,功能有二個: 監控主資料庫和從資料庫是否執行正常; 主資料出現故障後

死鎖及其解決方案(避免預防檢測)

所謂死鎖:是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖 死鎖產生的原因? 1.因競爭資源發生死鎖 現象:系統中供多個程序共享的資源的數目不足以滿足全部程序的需要時,就會引起對

app與後臺的tokensessionIdRSA加密登入認證與安全解決方案

一、登入機制 粗略地分析, 登入機制主要分為登入驗證、登入保持、登出三個部分。登入驗證是指客戶端提供使用者名稱和密碼,向伺服器提出登入請求,伺服器判斷客戶端是否可以登入並向客戶端確認。 登入認保持是指客戶端登入後, 伺服器能夠分辨出已登入的客戶端,併為其持續提供登入許可

[51CTO]區塊鏈在美國:10個案例10個問題和5個解決方案

區塊鏈在美國:10個案例、10個問題和5個解決方案 近日,美國國際戰略研究中心(CSIS, Center for Strategic and International Studies)釋出報告《利用區塊鏈實現美國商業與繁榮:10個案例、10個問題、5個解決方案》。詳細介紹了區塊鏈改進醫療、製造業、

IIS7.5 報錯 HTTP 錯誤 404.0- Not Found 您要找的資源已被刪除已更名或暫時不可用 解決方案···

HTTP 錯誤 404.2 - Not Found  由於 Web 伺服器上的“ISAPI 和 CGI 限制”列表設定,無法提供您請求的頁面。 開啟IIS,右邊操作裡選基本設定,應用程式池旁邊點選擇,模式改成Classic , 就是將管理模式切換為了經典模式。 出現環境:w

【格式工具】寫作(論文)中遇到的一些問題及其解決方案(持續更新......)

論文中一些常見的規則本文更新時間日誌:2018.04.29:以 office-word 為主,整理一些關於公式的問題;2018.05.24:參考文獻(會議論文)的格式及其搜尋方法;===========================================【offi

web.xml中配置訪問資源URL/時無法訪問.html.jsp.js.css等靜態資源時的解決方案

在web應用中,我們在web.xml配置URL路徑問題時,經常這樣配置:<servlet-mapping> <servlet-name>spring-MVC</servlet-name> <url-pattern>/<

[Python2] Win7(x64)下安裝Py2.7pip,以及錯誤UnicodeEncodeError的解決方案

環境 Win7 (x64) 中文 安裝Python以及Pip 安裝setuptools 安裝pip 安裝完成後easy_install、pip均在目錄 C:\Python27\Scripts(記得將該目錄新增到系統環境變數中)

修改android studio中的avd sdk路徑avd sdk找不到的解決方案

很多人都遇到安裝android studio之後需要下載gradle和重新下載avd sdk的問題 首先,設定環境變數,ANDROID_SDK_HOME值為sdk所在目錄,GRADLE_HOME值為gradle所在目錄,在path中新增%ANDROID_SDK_HOME

Mac系統10.11及以上升級numpyscipy等python包報錯解決方案

最近看到引力波相關內容,其中關於科學家們使用了一個python的第三方包:GWPY包。好奇之下,自己也安裝了一下這個python包。但是發現一個問題。Mac系統自帶的python無法更新第三方包,其中報錯的是numpy包,錯誤如下: Collecting