成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分布式系統「高性能」大招之——緩存背后的“毀滅種子”

存儲 存儲軟件 分布式
布隆過濾器就是由一個很長的二進制向量和一系列隨機映射函數組成,將確定不存在的數據構建到過濾器中,用它來過濾請求。

[[332833]]

緩存雪崩

我們多次提到了「cache miss」這個詞,利用「cache miss」來更好的保障DB和緩存之間的數據一致性。

然而,任何事物都是有兩面性的,「cache miss」在提供便利的同時,也帶來了一個潛在風險。

這個風險就是「緩存雪崩」。

 

分布式系統「高性能」大招之——緩存背后的“毀滅種子”

 

在圖中的第二步,大量的請求并發進入,這里的一次「cache miss」就有可能導致產生「緩存雪崩」。

不過,雖然「cache miss」會產生「緩存雪崩」,但「緩存雪崩」并不僅僅產生于「cache miss」。

雪崩一詞源于「雪崩效應」,是指像「多米勒骨牌」這樣的級聯反應。前面沒頂住,導致影響后面,如此蔓延。(關于對應雪崩的方式參考之前的文章,文末放鏈接)

所以「緩存雪崩」的根本問題是:緩存由于某些原因未起到預期的緩沖效果,導致請求全部流轉到數據庫,造成數據庫壓力過重。

因此,流量激增、高并發下的緩存過期、甚至緩存系統宕機都有可能產生「緩存雪崩」問題。

怎么解決這個問題呢?宕機可以通過做高可用來解決(可以參考之前的文章,文末放鏈接)。而在“流量激增”、“高并發下的緩存過期”這兩種場景下,也有兩種方式可以來解決。

加鎖排隊

通過加鎖或者排隊機制來限制讀數據庫寫緩存的線程數量。比如,下面的偽代碼就是對某個key只允許一個線程進入的效果。

  1. key = "aaa"; 
  2. ​ 
  3. var cacheValue = cache.read(key); 
  4. if (cacheValue != null) { 
  5.  return cacheValue; 
  6. else { 
  7.  lock(key) { 
  8.  cacheValue = cache.read(key); 
  9.  if (cacheValue != null) { 
  10.  return cacheValue; 
  11.  }  
  12.  else { 
  13.  cacheValue = db.read(key); 
  14.  cache.set(key,cacheValue); 
  15.  } 
  16.  } 
  17.  return cacheValue; 

這個比較好理解,就不廢話了。

緩存時間增加隨機值

這個主要針對的是「緩存定時過期」機制下的取巧方案。它的目的是避免多個緩存key在同一時間失效,導致壓力更加集中。

比如,你有10個key,他們的過期時間都是30分鐘的話,那么30分鐘后這10個key的所有請求會同時流到db去。

而這里說的這種方式就是將這10個key的過期時間打亂,比如設置成25、26、27、...、34分的過期時間,這樣壓力就被分散了,每分鐘只有一個key過期。

最簡單粗暴的方式就是在設置「過期時間」的時候加一個隨機數字。

cache.set(key,cacheValue,30+random())

總體來看,相比后者,前者的適用面更廣,所以Z哥建議你用「加鎖排隊」作為默認的通用方案不失為一個不錯的選擇。

「緩存穿透」、「緩存雪崩」傻傻分不清楚?

如果你聽說過「緩存穿透」的話,可能會問:「緩存雪崩」和「緩存穿透」一樣嗎?

從產生的效果上看是一樣的,但是過程不同。

來舉個例子。例子純屬虛構,別太在意合理性。

在一個方圓一萬里的地區內,只有一個修手機的老師傅。他收了一個徒弟,希望徒弟能幫他分擔掉一部分的工作壓力。這里的老師傅可以看作是DB,徒弟看作是緩存。

老師傅對徒弟說,如果遇到你不會做的事你來請教我。

然后,一個客戶過來說要修一下他的衛星電話,徒弟去請教老師傅,老師傅說他也不會,先拒絕了吧。

但是由于沒告訴他后續遇到修衛星電話的人該怎么做,所以后續這個客戶一直來問,徒弟每次都又去請教老師傅。最終,在修衛星電話這件事上,徒弟并沒有幫老師傅緩解任何的壓力,快被煩死了。

上面這個故事就好比「緩存穿透」。

而「緩存雪崩」則是,由于徒弟年輕力壯,精力充沛,1小時能修20個手機,老師傅只能修10個(但是手藝好,更考究)。

然后,有一天徒弟請假了,但恰巧這天來了2000個修手機的,老師傅修不過來就被累垮了。

所以,「緩存穿透」和「緩存雪崩」最終產生的效果是一樣的,就是因為大量請求流到DB后,把DB拖垮(正如前面故事中的老師傅)。

兩者最大的不同在于,「緩存雪崩」問題只要數據從db中找到并放入緩存就能恢復正常(徒弟休假歸來),而「緩存穿透」指的是所需的數據在DB中一直不存在的情況(老師傅也不會修)。并且,由于DB中數據不存在,所以自然每次從緩存中也找不到(徒弟也不會修)。

清楚了兩者的區別之后,我們下面就來聊聊「緩存穿透」的常見應對方式。

緩存穿透

「緩存穿透」有時也叫做「緩存擊穿」,產生的邏輯過程是這樣,一直在虛線范圍內流轉。

 

分布式系統「高性能」大招之——緩存背后的“毀滅種子”

 

在這種場景下,緩存的作用完全失效,每次請求都“穿透”到了DB中。

可能你會想,為什么會存在大量的這種db中數據不存在的情況呢?其實,任何依賴外部參數進行查詢的地方都可能有這個問題的存在。比如,一個文本輸入框,本來是讓你輸入用戶名的,但是手誤輸入了密碼,自然就找不到數據咯。更主要的問題是,會有惡意分子利用這種機制來對你的系統進行攻擊,擊穿緩存搞垮你的數據庫,導致整個系統全面癱瘓。

同樣也有兩種方式來解決這個問題。

布隆過濾器(bloomfilter)

布隆過濾器就是由一個很長的二進制向量和一系列隨機映射函數組成,將確定不存在的數據構建到過濾器中,用它來過濾請求。這里就放個圖,具體就不展開了,后續我們再聊(有興趣的可以先到搜索引擎搜《Space time trade-offs in hash coding with allowable errors》找到bloom的原始論文)。

實現代碼其實并不很復雜,參考論文或者網上其他作者的一些實現就可以寫出來。

不過,布隆過濾器有一個最大的缺點,也是其為了高效利用內存而付出的代價,就是無法確保100%的準確率。

所以,如果你的場景要求是100%準確的,就只能用下面這種方式了。

緩存空對象

其實就是哪怕從db中取出的數據是“空(null)”,也把它丟失到緩存中。

 

分布式系統「高性能」大招之——緩存背后的“毀滅種子”

 

這樣一來,雖然緩存中存在著一個value為空的數據,但是至少他能表示“數據庫里也沒有不用找了”。

其實這個思路和布隆過濾器有些類似,但是它對內存的消耗會大很多,畢竟布隆過濾器是利用的bit位來存儲。不過這種方式的優勢是前面提到的,不會出現誤差,而布隆過濾器的錯誤率會隨著「位數」的增加而減少,會不斷趨近于0,但不會為0。

總結

好了,我們一起總結一下。

這次呢,Z哥主要和你聊了隱藏在緩存中的兩顆具有“毀滅性”的種子,「緩存雪崩」和「緩存穿透」,以及應對這兩顆種子的常用方式。

而且,順便幫你區分清楚了「緩存雪崩」和「緩存穿透」的差異。

希望對你有所啟發。

 

分布式系統「高性能」大招之——緩存背后的“毀滅種子”

 

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2015-12-14 17:35:21

GemFire12306分布式

2021-07-06 10:35:46

分布式KafkaLinux

2022-04-07 17:13:09

緩存算法服務端

2011-09-14 10:08:07

Beanstalkd

2022-06-30 08:04:16

Redis分布式鎖Redisson

2018-12-14 10:06:22

緩存分布式系統

2012-12-28 17:31:06

2009-11-09 09:25:24

Memcached入門

2017-12-12 14:51:15

分布式緩存設計

2022-12-08 08:13:11

分布式數據庫CAP

2017-10-11 16:12:19

內存

2023-05-12 08:23:03

分布式系統網絡

2023-05-05 06:13:51

分布式多級緩存系統

2013-04-19 11:03:32

memcahce入門教分布式緩存系統

2009-02-06 09:38:38

memcached分布式緩存系統ASP.NET

2023-02-11 00:04:17

分布式系統安全

2023-05-12 11:52:21

緩存場景性能

2023-04-27 09:00:35

2023-05-29 14:07:00

Zuul網關系統

2019-09-12 08:50:37

Kafka分布式系統服務器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人在线看片 | 中文无吗 | 欧美午夜精品久久久久久浪潮 | 久久久精品一区二区 | 亚洲第1页 | 久久男人 | 日本成人片在线观看 | 成人精品网 | 这里只有精品999 | 欧美激情99 | 国产视频黄色 | 免费黄色录像视频 | 五月激情综合网 | 久久国产成人午夜av影院武则天 | 精品久久九 | 国产成人综合亚洲欧美94在线 | 中文字幕成人av | 国产免费一区二区三区免费视频 | 欧美人成在线视频 | 在线观看国产精品视频 | 欧美日韩成人一区二区 | 91视频三区 | 精品国产一区二区三区性色av | av大全在线观看 | 亚洲国产视频一区 | 久久草在线视频 | 国产一区二区成人 | 日韩精品成人一区二区三区视频 | 天天爽夜夜爽精品视频婷婷 | 精品成人免费一区二区在线播放 | 暖暖成人免费视频 | 天天干天天色 | 欧美精品被 | 人成久久 | 天天综合永久入口 | 91国在线高清视频 | 日韩在线h| 青青草中文字幕 | 久久久久亚洲视频 | 亚洲欧美国产一区二区三区 | 国产一区二区三区在线视频 |