概述:快取是分布式系統中的重要元件,主要解決高併發,大資料場景下,熱點資料訪問的效能問題。提供高效能的資料快速訪問。
(1)快取穿透:訪問乙個不存在的key,快取不起作用,請求會穿透到db,流量大時db會掛掉。
解決的辦法:1採用布隆過濾器,使用乙個足夠大的bitmap,用於儲存可能訪問的key,不存在的key直接被過濾。2訪問key未在db查詢到值,也將空值寫進快取,但可以設定較短過期時間。
(2)快取擊穿:上乙個存在的key,在快取過期的一刻,同時有大量的請求,這些請求都會擊穿到db,造成瞬時db請求量大、壓力驟增。
解決的辦法:1使用互斥鎖,該方法是比較普遍的做法,即,在根據key獲得的value值為空時,先鎖上,再從資料庫載入,載入完畢,釋放鎖。若其他執行緒發現獲取鎖失敗,則睡眠50ms後重試。2"提前"使用互斥鎖(mutex key):在value內部設定1個超時值(timeout1), timeout1比實際的memcache timeout(timeout2)小。當從cache讀取到timeout1發現它已經過期時候,馬上延長timeout1並重新設定到cache。然後再從資料庫載入資料並設定到cache中。3. "永遠不過期": 這裡的「永遠不過期」包含兩層意思:(1) 從redis上看,確實沒有設定過期時間,這就保證了,不會出現熱點key過期問題,也就是「物理」不過期。(2) 從功能上看,如果不過期,那不就成靜態的了嗎。所以我們把過期時間存在key對應的value裡,如果發現要過期了,通過乙個後台的非同步執行緒進行快取的構建,也就是「邏輯」過期.
(3)快取雪崩:快取雪崩是指在我們設定快取時採用了相同的過期時間,導致快取在某一時刻同時失效,請求全部**到db,db瞬時壓力過重雪崩。
解決的辦法:1要麼給每個key的過期時間加乙個隨機值,避免同時過期,達到錯峰重新整理快取的目的。2給每乙個快取資料增加相應的快取標記,記錄快取的是否失效,如果快取標記失效,則更新資料快取
(4)快取重新整理:既清空快取 ,一般在insert、update、delete操作後就需要重新整理快取,如果不執行就會出現髒資料。但當快取請求的系統蹦掉後,返回給快取的值為null。
快取有各類特徵,而且有不同介質的區別,那麼實際工程中我們怎麼去對快取分類呢?在目前的應用服務框架中,比較常見的,時根據快取雨應用的藕合度,分為local cache(本地快取)和remote cache(分布式快取):
memcached是應用較廣的開源分布式快取產品之一,它本身其實不提供分布式解決方案。在服務端,memcached集群環境實際就是乙個個memcached伺服器的堆積,環境搭建較為簡單;cache的分布式主要是在客戶端實現,通過客戶端的路由處理來達到分布式解決方案的目的。客戶端做路由的原理非常簡單,應用伺服器在每次訪問某key的value時,通過某種演算法把key對映到某台memcached伺服器nodea上,因此這個key所有操作都在nodea上,
memcached客戶端採用一致性hash演算法作為路由策略,如上圖右,相對於一般hash(如簡單取模)的演算法,一致性hash演算法除了計算key的hash值外,還會計算每個server對應的hash值,然後將這些hash值對映到乙個有限的值域上(比如0~2^32)。通過尋找hash值大於hash(key)的最小server作為儲存該key資料的目標server。如果找不到,則直接把具有最小hash值的server作為目標server。同時,一定程度上,解決了擴容問題,增加或刪除單個節點,對於整個集群來說,不會有大的影響。最近版本,增加了虛擬節點的設計,進一步提公升了可用性。
無特殊場景下,key-value能滿足需求的前提下,使用memcached分布式集群是較好的選擇,搭建與操作使用都比較簡單;分布式集群在單點故障時,只影響小部分資料異常,目前還可以通過magent快取**模式,做單點備份,提公升高可用;整個快取都是基於記憶體的,因此響應時間是很快,不需要額外的序列化、反序列化的程式,但同時由於基於記憶體,資料沒有持久化,集群故障重啟資料無法恢復。高版本的memcached已經支援cas模式的原子操作,可以低成本的解決併發控制問題。
我是 lru 快取演算法,我把最近最少使用的快取物件給踢走。
我總是需要去了解在什麼時候,用了哪個快取物件。如果有人想要了解我為什麼總能把最近最少使用的物件踢掉,是非常困難的。
瀏覽器就是使用了我(lru)作為快取演算法。新的物件會被放在快取的頂部,當快取達到了容量極限,我會把底部的物件踢走,而技巧就是:我會把最新被訪問的快取物件,放到快取池的頂部。
所以,經常被讀取的快取物件就會一直呆在快取池中。有兩種方法可以實現我,array 或者是 linked list。
我的速度很快,我也可以被資料訪問模式適配。我有乙個大家庭,他們都可以完善我,甚至做的比我更好(我確實有時會嫉妒,但是沒關係)。我家庭的一些成員包括 lru2 和 2q,他們就是為了完善 lru 而存在的。
我是先進先出,我是乙個低負載的演算法,並且對快取物件的管理要求不高。我通過乙個佇列去跟蹤所有的快取物件,最近最常用的快取物件放在後面,而更早的快取物件放在前面,當快取容量滿時,排在前面的快取物件會被踢走,然後把新的快取物件加進去。我很快,但是我並不適用。
count快取設計問題總結
在設計count快取過程中遇到的一些問題,現總結如下,望共勉 1.在分布式併發情況下如何考慮原子性操作?使用memcache的計數器實現 2.memcache的計數器沒有失效時間的概念,如何納入失效時間?另外使用儲存乙個cache,用它的失效時間作為快取計數器的失效時間,該cache失效則計數器刪除...
快取常見問題總結
1.現象 request請求在cache中未找到資料,直接查詢storage 2.原因 2.1業務 自身問題 在資料庫中未找到資料,進入死迴圈 2.2惡意攻擊 爬蟲等 大量不存在資料查詢資料庫,進入死迴圈 3.如何發現 3.1業務響應時間 3.2業務本身問題 4.解決方法 4.1快取空物件 儲存層返...
快取 快取問題
指的是對某個一定不存在的資料進行請求,該請求將會穿透快取到達資料庫。解決方案 指的是由於資料沒有載入到快取中,或者快取資料在同一時間出現大面積的失效 過期 又或者是快取伺服器崩潰,導致大量的請求都到達資料庫。在有快取的系統中,系統非常的依賴快取,快取分擔了很大一部分的資料請求,當發生快取雪崩時,資料...