面試準備 高併發快取研究

2021-10-02 09:00:17 字數 1109 閱讀 4240

高併發口訣: 讀多寫少用快取,寫多讀少用佇列

使用快取時難免遇到兩個問題:快取雪崩、快取擊穿

快取雪崩是指:大批量快取失效,或者單個快取的時間突然失效的時間點大批量訪問導致都查資料庫。

大批量失效我們可以吧過期時間設定成隨機的均勻分布。

單個的失效大批量訪問,可以加鎖,讓查庫的動作乙個人來做。

lock 這個api可以實現鎖,但是個粗粒度的鎖,可以以車次號為鍵做細粒度的鎖。

對於沒拿到鎖的人可以根據需求做不同的降級策略。

可以直接讓他等鎖開,但這樣伺服器壓力大。

可以給個異常值,直接告訴正忙。

可以給個特殊值。

可以查詢二級快取(無過期時間的那種),給他幾分鐘前的值,二級沒有的再給特殊值。

細粒度鎖+降級,綜合起來比較好。

快取擊穿是指,攻擊者去訪問乙個不存在的鍵去查詢。不存在也就沒有快取,直接查到了資料庫。

對於不存在的某個鍵了,多次訪問的情況。可以給做空快取緩解。

但是當大批量不存在的鍵一起查時,加空快取杯水車薪。

這是需要給資料庫裡的資料快取乙個白名單,查庫之前先查白名單,有了才能查庫。

使用普通的jvm 裡的list 的方式可以實現小資料量級別。

當大資料時,儲存都是問題,更不用提查詢的效率。

這時引入布隆過濾器,需要乙個把資料庫裡的id先進行雜湊計算,計算出雜湊code,然後存進乙個二進位制陣列中去。

不使用二進位制陣列之前,乙個位置存乙個位元組的話需要8b,使用之後8個位置才佔1b,**10億商品原來需要存32gb的資料量,現在在乙個512m的陣列裡就可以實現雜湊查詢。

這裡的大陣列用redis裡的bigmap實現

long size = math.pow(2,32);

for(string id:ids){

long num = (long)math.abs(id.hashcode() % size);

redis.setbigmap("bigmap",num,true);

找的時候,再算雜湊值,利用雜湊值查詢是否存在。

不存在的話直接返回,避免查庫。

高併發 快取

開闢乙個新的資料交換區,以解決原始資料獲取代價太大的問題,讓資料得到更快的訪問。問題1 快取雪崩 問題2 資料不一致 現象 資料發生更新時,db和快取的資料不一致,多個快取副本的資料不一致。原因 更新發生異常 策略 快取更新失敗後加入重試佇列 ttl縮短 問題3 hotkey 原因 微博數百萬使用者...

高併發快取實現

private static concurrenthashmap gloddeptfutumap new concurrenthashmap future 介面允許表示已經完成的任務 正在執行過程中的任務或者尚未開始執行的任務。futuretask 類實現了 future,幷包含一些建構函式,允許將...

高併發架構面試題之快取七

redis 的併發競爭問題是什麼?如何解決這個問題?了解 redis 事務的 cas 方案嗎?面試官心理分析 這個也是線上非常常見的乙個問題,就是多客戶端同時併發寫乙個 key,可能本來應該先到的資料後到了,導致資料版本錯了 或者是多客戶端同時獲取乙個 key,修改值之後再寫回去,只要順序錯了,資料...