1. 程式人生 > >快取失效,導致高併發穿透DB的幾種解決思路

快取失效,導致高併發穿透DB的幾種解決思路

其實,這個場景幾乎每個程式設計師都會接觸到,但是還是有很多程式設計師對這種思路沒有好的辦法,下面我再整理下之前收集到的資料,重新發下。由於該文章轉載很多,找不到準確出處。如有侵權,請聯絡我。

當快取失效時,容易出現高併發的查詢DB,導致DB壓力驟然上升,這種現象我們稱之為快取穿透。

這篇blog主要是探討如何在快取將要失效時,及時地更新快取,而不是如何在快取失效之後,如何防止高併發的DB查詢

個人認為,當快取將要失效時,及時地把新的資料刷到快取裡,這個是解決快取失效瞬間高併發查DB的最好方法。 那麼如何及時地知道快取將要失效?

解決這個問題有幾種思路:

比如一個key是testKey,失效時間是30s

1.定期從DB裡查詢資料,再刷到快取裡

缺點:有些業務的key可能是變化的,不確定的。而且不好界定哪些資料是應該查詢出來放到快取中的,難以區分冷熱資料

2.當快取取到為null時,加鎖去查詢DB,只允許一個執行緒去查詢DB

缺點:這種方式不太靠譜,不多討論。 而且如果是多個web伺服器的話,還是有可能有併發的操作

3.在向快取寫入value時,同時寫入當前機器在時間作為過期時間

當get得到資料時,如果當前時間 – 過期時間 > 5s,則後臺啟動一個任務去查詢DB,更新快取

當然,這裡的後臺任務必須保證同一個key,只有一個執行緒在執行查詢DB的任務,不然這個還是高併發查詢DB

缺點:是要把過期時間和value合在一起序列化,取出資料後,還要反序列化。 很不方便

網上大部分文章提到的全都是前面兩種方式,有少數文章提到第3種方式。 下面提出一種基於兩個key的方法:

4.兩個key,一個key用來存放資料,另一個用來標記失效時間

比如key是testKey,設定失效時間為30s,則另一個key為expire_testKey,失效時間為25s。用multiget,同時取出testKey和expire_testKey,如果expire_testKey的為null,則後臺啟動一個任務加鎖去查詢DB,更新快取。叢集式的部署的,如何實現只允許一個任務執行,用到memcached的add命令,或redis的setnx命令。設定expire_testKey超時過間為3s,防止後臺任務失敗或者阻塞。

缺點:記憶體翻倍,而且程式上要維護2個key。

5.兩個key,時間存到value裡,結合add/setnx來保證原子性更新快取

最近重新思考了下這個問題。 發現第4種兩個key的辦法比較耗memcached的記憶體,因為key數翻倍了。 結合第3種方式,重新設計了下,思路如下。

仍然使用2個key方案,但是expire_testKey相當於鎖。只允許add/setnx成功的執行緒去更新資料。更新成功後把expire_testKey進行刪除。由於這個expire_testKey存在時間較短,不會佔用太多快取記憶體。

優點:節省記憶體,資料是自然冷熱適應的,不用擔心叢集帶來併發風險

總結:

我個人是傾向於第5種方式的,因為很簡單,直觀。 比第4種方式要節省記憶體,而且不用mget,在使用memcached叢集時不用擔心出麻煩事

這種兩個key的方式,還有一個好處,就是資料是自然冷熱適應的。 如果是冷資料,30秒都沒有人訪問,那麼資料會過期

如果是熱門資料,一直有大流量訪問,那麼資料就是一直熱的,而且資料一直不會過期

相關推薦

快取失效導致併發穿透DB解決思路

其實,這個場景幾乎每個程式設計師都會接觸到,但是還是有很多程式設計師對這種思路沒有好的辦法,下面我再整理下之前收集到的資料,重新發下。由於該文章轉載很多,找不到準確出處。如有侵權,請聯絡我。 當快取失效時,容易出現高併發的查詢DB,導致DB壓力驟然上升,這種現象我們稱

應對Memcached快取失效導致併發查詢DB思路

最近看到nginx的合併回源,這個和下面的思路有點像。不過nginx的思路還是在控制快取失效時的併發請求,而不是當快取快要失效時,及時地更新快取。 nginx合併回源,參考:http://blog.csdn.net/brainkick/article/details/857

應對Memcache緩存失效導致並發查詢DB

post 過期 == 導致 寫入 標記 線程 name memcach 當Memcached緩存失效時,容易出現高並發的查詢DB,導致DB壓力驟然上升。 這篇blog主要是探討如何在緩存將要失效時,及時地更新緩存,而不是如何在緩存失效之後,如何防止高並發的DB查詢。 解決

memcached快取失效時的併發訪問問題解決

memcached一般用於在訪問一些效能相對低下的資料介面時(如資料庫),為了保證這些資料介面的穩定性,加上memcached以減少訪問次數,保證這些資料介面的健壯性。一般memcached的資料都是定時失效的,當資料失效時一般會再次去訪問取資料介面,然後將其更新至m

“模板檔案不存在無法解析文件”的解決辦法

許多朋友在一鍵更新網站後,總會出現“模板檔案不存在,無法解析文件”這個問題,所以織夢模板之家為大家整理了一下幾種辦法,可以都嘗試一下!總有一種能解決的。 方法一:【此對應喜歡把模板檔案使用".html"的格式,】 /include/arc.archives.cla

併發快取處理之——快取穿透形式及解決方案

快取失效的幾種形式 1 快取穿透 快取穿透是指查詢一個一定不存在的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義。在流量大時,可能DB就掛掉了,要是有人利用不存在

小程式 textarea、input 層級過導致填寫內容穿透z-index無效問題解決方案。

小程式的textare、input輸入框層級是最高的 那麼我們在textare、input輸入的內容就會總是顯示在最上一層。 這是時為什麼呢?官方文件有說明,因為textare、input這些是原生元件。原生元件的層級是最高的,不管其它非原生元件z-index設定多大,

mina通訊對於併發的產生:java.io.IOException: Too many open files(開啟檔案控制代碼過多問題)

起因:由於業務系統有多個定時任務定時訪問銀行端,銀行每天也有大量業務訪問業務系統,都是通過mina通訊,部署在測試環境的系統每過一兩天開啟控制代碼過萬,生產的也是一週左右不重啟業務系統就會爆掉。一開始並不清楚到底是哪方面原因導致控制代碼增長這麼快,因為這是一個老系統,經過多次升級,大量的併發、多執行緒,所以只

redis可用保證併發

就是如果你用redis快取技術的話,肯定要考慮如何用redis來加多臺機器,保證redis是高併發的,還有就是如何讓Redis保證自己不是掛掉以後就直接死掉了,redis高可用 我這裡會選用我之前講解過這一塊內容,redis高併發、高可用、快取一致性 re

Nginx優化詳細應對併發

 nginx指令中的優化(配置檔案) worker_processes 8;   nginx程序數,建議按照cpu數目來指定,一般為它的倍數。 worker_cpu_affinity 00000001 00000010 00000100 00001000 0001000

【Java開發者專場】阿里特邀專家徐雷:Java為王網際網路併發架構設計選型之路

本篇文章來自於2018年12月22日舉辦的《阿里雲棲開發者沙龍—Java技術專場》,徐雷專家是該專場第三位演講的嘉賓,本篇文章是根據徐雷專家在《阿里雲棲開發者沙龍—Java技術專場》的演講視訊以及PPT整理而成。 摘要:Java從誕生以來幾乎一直是排名第一的語言,長期霸榜。在架構師成長道路中,學習Ja

併發架構系列:如何解決Redis雪崩、穿透併發等5大難題

一、快取雪崩 資料未載入到快取中,或者快取同一時間大面積的失效,從而導致所有請求都去查資料庫,導致資料庫CPU和記憶體負載過高,甚至宕機。 比如一個雪崩的簡單過程: 1、redis叢集大面積故障; 2、快取失效,但依然大量請求訪問快取服務redis; 3、redis大量失效後,大量請求轉

執行緒池處理併發問題處理大資料量的方法

執行緒池個人認為,執行緒池的作用就是限制系統中執行執行緒的數量,避免伺服器超負荷;減少建立和銷燬執行緒的次數,從而減少了一些開銷。設計一個執行緒池單例,在內部建立指定數目的執行緒,並用一個執行緒空閒隊列表示可分配執行緒。注:還可以使用兩個靜態成員變數的方法限定最大執行緒數量。

java高階併發可用、高效能、分散式、負載均衡

1、億級流量電商網站的商品詳情頁系統架構 面臨難題:對於每天上億流量,擁有上億頁面的大型電商網站來說,能夠支撐高併發訪問,同時能夠秒級讓最新模板生效的商品詳情頁系統的架構是

vmware12中ubuntu15 16的vmware tools失效導致不能複製貼上檔案以及自動適應視窗解析度

我的虛擬機器已完全解決該問題: ubuntu16.4 server+lightdm+xubuntu 新安裝或異常關機或重新劃分分割槽導致的vmware tools失效--不能複製貼上檔案以及自動適應視窗解析度,無論怎樣重灌vmware tools或open-vm-tools

簡單的MySQL連線池支援併發

/** * 連線池類 */ package com.junones.test; import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; imp

eclipse上一次沒有正確關閉導致啟動的時候卡死錯誤解決方法

delete eclipse 刪除 關閉 進入 nap 解決方法 文件 delet 關於 eclipse啟動卡死的問題(eclipse上一次沒有正確關閉,導致啟動的時候卡死錯誤解決方法),自己常用的解決方法: 方案一(推薦使用,如果沒有這個文件,就使用方案二):

Web大規模併發請求和搶購的解決方案

電商的秒殺和搶購,對我們來說,都不是一個陌生的東西。然而,從技術的角度來說,這對於Web系統是一個巨大的考驗。當一個Web系統,在一秒鐘內收到數以萬計甚至更多請求時,系統的優化和穩定至關重要。這次我們會關注秒殺和搶購的技術實現和優化,同時,從技術層面揭開,為什麼我們總是不容易搶到火車票的原因

深入理解併發下分散式事務的解決方案

1、什麼是分散式事務 分散式事務就是指事務的參與者、支援事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點之上。以上是百度百科的解釋,簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分佈在不同的伺服器上,且屬於不同的應用,分散式事務需要保證這

併發的詳解及解決方案

一、什麼是高併發 高併發(High Concurrency)是網際網路分散式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。   高併發相關常用的一些指標有響應時間(Response Time),吞吐量(Throughput),每秒查詢率QPS(Quer