2 redis用來做什麼?
通常侷限點來說,redis也以訊息佇列的形式存在,作為內嵌的list存在,滿足實時的高併發需求。而通常在乙個電商型別的資料處理過程之中,有關商品,熱銷,推薦排序的佇列,通常存放在redis之中,期間也包擴storm對於redis列表的讀取和更新。
redis的缺點
是資料庫容量受到物理記憶體的限制,不能用作海量資料的高效能讀寫,因此redis適合的場景主要侷限在較小資料量的高效能操作和運算上。
總結: redis受限於特定的場景,專注於特定的領域之下,速度相當之快,目前還未找到能替代使用產品
在我們日常的開發中,無不都是使用資料庫來進行資料的儲存,由於一般的系統任務中通常不會存在高併發的情況,所以這樣看起來並沒有什麼問題,可是一旦涉及大資料量的需求,比如一些商品搶購的情景,或者是主頁訪問量瞬間較大的時候,單一使用資料庫來儲存資料的系統會因為面向磁碟,磁碟讀/寫速度比較慢的問題而存在嚴重的效能弊端,一瞬間成千上萬的請求到來,需要系統在極短的時間內完成成千上萬次的讀/寫操作,這個時候往往不是資料庫能夠承受的,極其容易造成資料庫系統癱瘓,最終導致服務宕機的嚴重生產問題。
為了克服上述的問題,專案通常會引入nosql技術,這是一種基於記憶體的資料庫,並且提供一定的持久化功能。
redis技術就是nosql技術中的一種,但是引入redis又有可能出現快取穿透,快取擊穿,快取雪崩等問題。本文就對這三種問題進行較深入剖析。
二、初認識
快取穿透:key對應的資料在資料來源並不存在,每次針對此key的請求從快取獲取不到,請求都會到資料來源,從而可能壓垮資料來源,比如對乙個不存在的使用者id獲取使用者資訊,不論快取還是資料庫都沒有,若黑客利用此漏洞進行攻擊可能壓垮資料庫
快取擊穿:key對應的資料存在,但是redis中過期,此時若大量併發請求過來,這些請求快取過期一般都會從後端db載入資料並回設到快取,這個時候大併發的請求可能會瞬間把後端db壓垮
快取雪崩:當快取伺服器重啟或者大量快取集中在某乙個時間段失效,這樣在失效的時候,也會對後端系統帶來很大壓力
有很多種方法可以有效地解決快取穿透問題,最常見的則是採用布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bitmap中,乙個一定不存在的資料會被 這個bitmap攔截掉,從而避免了對底層儲存系統的查詢壓力。另外也有乙個更為簡單粗暴的方法(我們採用的就是這種),如果乙個查詢返回的資料為空(不管是資料不存在,還是系統故障),我們仍然把這個空結果進行快取,但它的過期時間會很短,最長不超過五分鐘。
//key可能會在某些時間點被超高併發地訪問,是一種非常「熱點」的資料。這個時候,需要考慮乙個問題:快取被「擊穿」的問題。偽**public
object getproductlistnew()
cachevalue =cachehelper.get(cachekey);
if (cachevalue != null
) else
cachehelper.add(cachekey, cachevalue, cachetime);
return
cachevalue;}}
使用互斥鎖(mutex key)
業界比較常用的做法,是使用mutex。簡單地來說,就是在快取失效的時候(判斷拿出來的值為空),不是立即去load db,而是先使用快取工具的某些帶成功操作返回值的操作(比如redis的setnx或者memcache的add)去set乙個mutex key,當操作返回成功時,再進行load db的操作並回設快取;否則,就重試整個get快取的方法。
public與快取擊穿的區別在於這裡針對很多key快取,前者則是某乙個key。string get(key)
else
} else
}
快取正常從redis中獲取,示意圖如下:
快取失效瞬間示意圖如下:
快取失效時的雪崩效應對底層系統的衝擊非常可怕!大多數系統設計者考慮用加鎖或者佇列的方式保證來保證不會有大量的執行緒對資料庫一次性進行讀寫,從而避免失效時大量的併發請求落到底層儲存系統上。還有乙個簡單方案就時講快取失效時間分散開,比如我們可以在原有的失效時間基礎上增加乙個隨機值,比如1-5分鐘隨機,這樣每乙個快取的過期時間的重複率就會降低,就很難引發集體失效的事件。
關於快取崩潰的解決方法,這裡提出了三種方案:使用鎖或佇列、設定過期標誌更新快取、為key設定不同的快取失效時間,還有一種被稱為「二級快取」的解決方法。
參考部落格:
Docker的使用場景以及優缺點
虛擬機器的最大好處是能在你的硬體設施上執行各種配置不一樣的平台 軟體,系統 docker在降低額外開銷的情況下提供了同樣的功能.它能讓你將執行環境和配置放在 彙總然後部署,同乙個docker的配置可以在不同的環境環境中使用,這樣就降低了硬體要求和應用環境之間耦合度.從開發者的機器到最終在生產環境上的...
Docker的使用場景以及優缺點
虛擬機器的最大好處是能在你的硬體設施上執行各種配置不一樣的平台 軟體,系統 docker在降低額外開銷的情況下提供了同樣的功能.它能讓你將執行環境和配置放在 彙總然後部署,同乙個docker的配置可以在不同的環境環境中使用,這樣就降低了硬體要求和應用環境之間耦合度.從開發者的機器到最終在生產環境上的...
SVN和Git的區別,優缺點,使用場景
最核心的區別git是分布式的,而svn不是分布的。2 git把內容按元資料方式儲存,而svn是按檔案 git沒有乙個全域性版本號,而svn有 git的內容的完整性要優於svn 剛開始用時很狗血的一點,svn必須先update才能commit,忘記了合併時就會出現一些錯誤,git還是比較少的出現這種情...