精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

解密扛住萬億流量的架構(gòu)秘籍:一線大廠高并發(fā)通用基礎(chǔ)架構(gòu)設(shè)計三大殺手锏!

數(shù)據(jù)庫
高并發(fā)意味著系統(tǒng)要應(yīng)對海量請求。從冰河多年的面試經(jīng)驗來看,很多面試者在面對“什么是高并發(fā)架構(gòu)”的問題時,往往會粗略地認為一個系統(tǒng)的設(shè)計是否滿足高并發(fā)架構(gòu),就是看這個系統(tǒng)是否可以應(yīng)對海量請求。

既然是億級用戶應(yīng)用,那么高并發(fā)必然是其架構(gòu)設(shè)計的核心要素,今天,冰河將介紹萬億級流量場景下,高并發(fā)基礎(chǔ)架構(gòu)設(shè)計的一些通用設(shè)計方案。

高并發(fā)架構(gòu)設(shè)計的要點

高并發(fā)意味著系統(tǒng)要應(yīng)對海量請求。從冰河多年的面試經(jīng)驗來看,很多面試者在面對“什么是高并發(fā)架構(gòu)”的問題時,往往會粗略地認為一個系統(tǒng)的設(shè)計是否滿足高并發(fā)架構(gòu),就是看這個系統(tǒng)是否可以應(yīng)對海量請求。再細問具體的細節(jié)時,回答往往顯得模棱兩可,比如每秒多少個請求才是高并發(fā)請求、系統(tǒng)的性能表現(xiàn)如何、系統(tǒng)的可用性表現(xiàn)如何,等等。

為了可以清晰地評判一個系統(tǒng)的設(shè)計是否滿足高并發(fā)架構(gòu),在正式給出通用的高并發(fā)架構(gòu)設(shè)計方案前,我們先要厘清形成高并發(fā)系統(tǒng)的必要條件、高并發(fā)系統(tǒng)的衡量指標(biāo)和高并發(fā)場景分類。

形成高并發(fā)系統(tǒng)的必要條件

  • 高性能: 性能代表一個系統(tǒng)的并行處理能力,在同樣的硬件設(shè)備條件下,性能越高,越能節(jié)約硬件資源;同時性能關(guān)乎用戶體驗,如果系統(tǒng)響應(yīng)時間過長,用戶就會產(chǎn)生抱怨。
  • 高可用性: 系統(tǒng)可以長期穩(wěn)定、正常地對外提供服務(wù),而不是經(jīng)常出故障、宕機、崩潰。
  • 可擴展性: 系統(tǒng)可以通過水平擴容的方式,從容應(yīng)對請求量的日漸遞增乃至突發(fā)的請求量激增。

我們可以將形成高并發(fā)系統(tǒng)的必要條件類比為一個籃球運動員的各項屬性:“高性能”相當(dāng)于這個球員在賽場上的表現(xiàn)力強,“高可用性”相當(dāng)于這個球員在賽場上總可以穩(wěn)定發(fā)揮,“可擴展性”相當(dāng)于這個球員的未來成長性好。

高并發(fā)系統(tǒng)的衡量指標(biāo)

1. 高性能指標(biāo)

一個很容易想到的可以體現(xiàn)系統(tǒng)性能的指標(biāo)是,在一段時間內(nèi)系統(tǒng)的平均響應(yīng)時間。例如,在一段時間內(nèi)有10000個請求被成功響應(yīng),那么在這段時間內(nèi)系統(tǒng)的平均響應(yīng)時間是這10000個請求響應(yīng)時間的平均值。

然而,平均值有明顯的硬傷并在很多數(shù)據(jù)統(tǒng)計場景中為大家所調(diào)侃。假設(shè)你和傳奇籃球巨星姚明被分到同一組,你的身高是174cm,姚明的身高是226cm,那么這組的平均身高是2m!這看起來非常不合理。

假設(shè)在10000個請求中有9900個請求的響應(yīng)時間分別是1ms,另外100個請求的響應(yīng)時間分別是100ms,那么平均響應(yīng)時間僅為1.99ms,完全掩蓋了那100個請求的100ms響應(yīng)時間的問題。平均值的主要缺點是易受極端值的影響,這里的極端值是指偏大值或偏小值——當(dāng)出現(xiàn)偏大值時,平均值將會增大;當(dāng)出現(xiàn)偏小值時,平均值將會減小。

冰河推薦的系統(tǒng)性能的衡量指標(biāo)是響應(yīng)時間PCTn統(tǒng)計方式,PCTn表示請求響  應(yīng)時間按從小到大排序后第n分位的響應(yīng)時間。假設(shè)在一段時間內(nèi)100個請求的響應(yīng)時間從小到大排序如圖所示,則第99分位的響應(yīng)時間是100ms,即PCT99= 100ms。

分位值越大,對響應(yīng)時間長的請求越敏感。比如統(tǒng)計10000個請求的響應(yīng)時間:

  • PCT50=1ms,表示在10000個請求中50%的請求響應(yīng)時間都在1ms以內(nèi)。
  • PCT99=800ms,表示在10000個請求中99%的請求響應(yīng)時間都在800ms以內(nèi)。
  • PCT999=1.2s,表示在10000個請求中99.9%的請求響應(yīng)時間都在1.2s以內(nèi)。

從冰河總結(jié)的經(jīng)驗數(shù)據(jù)來看,請求的平均響應(yīng)時間=200ms,且PCT99=1s的高并發(fā)系統(tǒng)基本能夠滿足高性能要求。如果請求的響應(yīng)時間在200ms以內(nèi),那么用戶不會感受到延遲;而如果請求的響應(yīng)時間超過1s,那么用戶會明顯感受到延遲。

2. 高可用性指標(biāo)

可用性=系統(tǒng)正常運行時間/系統(tǒng)總運行時間,表示一個系統(tǒng)正常運行的時間占比,也可以將其理解為一個系統(tǒng)對外可用的概率。我們一般使用N個9來描述系統(tǒng)的可用性如何,如表所示。

高可用性要求系統(tǒng)至少保證3個9或4個9的可用性。在實際的系統(tǒng)指標(biāo)監(jiān)控中,很多公司會取3個9和4個9的中位數(shù):99.95%(3個9、1個5),作為系統(tǒng)可用性監(jiān)控的閾值。當(dāng)監(jiān)控到系統(tǒng)可用性低于99.95%時及時發(fā)出告警信息,以便系統(tǒng)維護者可以及時做出優(yōu)化,如系統(tǒng)可用性補救、擴容、分析故障原因、系統(tǒng)改造等。

3. 可擴展性指標(biāo)

面對到來的突發(fā)流量,我們明顯來不及對系統(tǒng)做架構(gòu)改造,而更快捷、有效的做法是增加系統(tǒng)集群中的節(jié)點來水平擴展系統(tǒng)的服務(wù)能力。可擴展性=吞吐量提升比例/集群節(jié)點增加比例。在最理想的情況下,集群節(jié)點增加幾倍,系統(tǒng)吞吐量就能增加幾倍。一般來說,擁有70%~80%可擴展性的系統(tǒng)基本能夠滿足可擴展性要求。

高并發(fā)場景分類

我們使用計算機實現(xiàn)各種業(yè)務(wù)功能,最終將體現(xiàn)在對數(shù)據(jù)的兩種操作上,即讀和寫,于是高并發(fā)請求可以被歸類為高并發(fā)讀和高并發(fā)寫。

比如有的業(yè)務(wù)場景讀多寫少,需要重點解決高并發(fā)讀的問題;有的業(yè)務(wù)場景寫多讀少,需要重點解決高并發(fā)寫的問題;而有的業(yè)務(wù)場景讀多寫多,則需要同時解決高并發(fā)讀和高并發(fā)寫的問題。將高并發(fā)場景劃分為高并發(fā)讀場景和高并發(fā)寫場景,是因為在這兩種場景中往往有不同的高并發(fā)解決方案。

數(shù)據(jù)庫讀/寫分離

大部分互聯(lián)網(wǎng)應(yīng)用都是讀多寫少的,比如刷帖的請求永遠比發(fā)帖的請求多,瀏覽商品的請求永遠比下單購買商品的請求多。數(shù)據(jù)庫承受的高并發(fā)請求壓力,主要來自讀請求。

我們可以把數(shù)據(jù)庫按照讀/寫請求分成專門負責(zé)處理寫請求的數(shù)據(jù)庫(寫庫)和專門負責(zé)處理讀請求的數(shù)據(jù)庫(讀庫),讓所有的寫請求都落到寫庫,寫庫將寫請求處理后的最新數(shù)據(jù)同步到讀庫,所有的讀請求都從讀庫中讀取數(shù)據(jù)。這就是數(shù)據(jù)庫讀/寫分離的思路。

數(shù)據(jù)庫讀/寫分離使大量的讀請求從數(shù)據(jù)庫中分離出來,減少了數(shù)據(jù)庫訪問壓力,縮短了請求響應(yīng)時間。

讀/寫分離架構(gòu)

我們通常使用數(shù)據(jù)庫主從復(fù)制技術(shù)實現(xiàn)讀/寫分離架構(gòu),將數(shù)據(jù)庫主節(jié)點Master作為“寫庫”,將數(shù)據(jù)庫從節(jié)點Slave作為“讀庫”,一個Master可以與多個Slave連接,如圖所示。

市面上各主流數(shù)據(jù)庫都實現(xiàn)了主從復(fù)制技術(shù)。

讀/寫請求路由方式

在數(shù)據(jù)庫讀/寫分離架構(gòu)下,把寫請求交給Master處理,而把讀請求交給Slave處理,那么由什么角色來執(zhí)行這樣的讀/寫請求路由呢?一般可以采用如下兩種方式。

1. 基于數(shù)據(jù)庫Proxy代理的方式

在業(yè)務(wù)服務(wù)和數(shù)據(jù)庫服務(wù)器之間增加數(shù)據(jù)庫Proxy代理節(jié)點(下文簡稱Proxy),業(yè)務(wù)服務(wù)對數(shù)據(jù)庫的一切操作都需要經(jīng)過Proxy轉(zhuǎn)發(fā)。Proxy收到業(yè)務(wù)服務(wù)的數(shù)據(jù)庫操作請求后,根據(jù)請求中的SQL語句進行歸類,將屬于寫操作的請求(如insert/delete/update語句)轉(zhuǎn)發(fā)到數(shù)據(jù)庫Master,將屬于讀操作的請求(如select語句)轉(zhuǎn)發(fā)到數(shù)據(jù)庫任意一個Slave,完成讀/寫分離的路由。

開源項目如中心化代理形式的MySQL-Proxy和Mycat,以及本地代理形式的MySQL-Router等都實現(xiàn)了讀/寫分離功能。

2. 基于應(yīng)用內(nèi)嵌的方式

基于應(yīng)用內(nèi)嵌的方式與基于數(shù)據(jù)庫Proxy代理的方式的主要區(qū)別是,它在業(yè)務(wù)服務(wù)進程內(nèi)進行請求讀/寫分離,數(shù)據(jù)庫連接框架開源項目如gorm、shardingjdbc等都實現(xiàn)了此形式的讀/寫分離功能。

主從延遲與解決方案

數(shù)據(jù)庫讀/寫分離架構(gòu)依賴數(shù)據(jù)庫主從復(fù)制技術(shù),而數(shù)據(jù)庫主從復(fù)制存在數(shù)據(jù)復(fù)制延遲(主從延遲),因此會導(dǎo)致在數(shù)據(jù)復(fù)制延遲期間主從數(shù)據(jù)的不一致,Slave獲取不到最新數(shù)據(jù)。針對主從延遲問題有如下三種解決方案。

1. 同步數(shù)據(jù)復(fù)制

數(shù)據(jù)庫主從復(fù)制默認是異步模式,Master在寫完數(shù)據(jù)后就返回成功了,而不管Slave是否收到此數(shù)據(jù)。我們可以將主從復(fù)制配置為同步模式,Master在寫完數(shù)據(jù)后,要等到全部Slave都收到此數(shù)據(jù)后才返回成功。

這種方案可以保證數(shù)據(jù)庫每次寫操作成功后,Master和Slave都能讀取到最新數(shù)據(jù)。這種方案相對簡單,將數(shù)據(jù)庫主從復(fù)制修改為同步模式即可,無須改造業(yè)務(wù)服務(wù)。

但是由于在處理業(yè)務(wù)寫請求時,Master要等到全部Slave都收到數(shù)據(jù)后才能返回成功,寫請求的延遲將大大增加,數(shù)據(jù)庫的吞吐量也會有明顯的下滑。這種方案的實用價值較低,僅適合在低并發(fā)請求的業(yè)務(wù)場景中使用。

2. 強制讀主

不同的業(yè)務(wù)場景對主從延遲的容忍性不一樣。例如,用戶a剛剛發(fā)布了一條狀態(tài),他瀏覽個人主頁時應(yīng)該展示這條狀態(tài),這個場景不太能容忍主從延遲;而好友用戶b此時瀏覽用戶a的個人主頁時,可以暫時看不到用戶a最新發(fā)布的狀態(tài),這個場景可以容忍主從延遲。

我們可以對業(yè)務(wù)場景按照主從延遲容忍性的高低進行劃分,對于主從延遲容忍性高的場景,執(zhí)行正常的讀/寫分離邏輯;而對于主從延遲容忍性低的場景,強制將讀請求路由到數(shù)據(jù)庫Master,即強制讀主。

3. 會話分離

比如某會話在數(shù)據(jù)庫中執(zhí)行了寫操作,那么在接下來極短的一段時間內(nèi),此會話的讀請求暫時被強制路由到數(shù)據(jù)庫Master,與“強制讀主”方案中的例子很像,保證每個用戶的寫操作立刻對自己可見。暫時強制讀主的時間可以被設(shè)定為略高于數(shù)據(jù)庫完成主從數(shù)據(jù)復(fù)制的延遲時間,盡量使強制讀主的時間段覆蓋主從數(shù)據(jù)復(fù)制的實際延遲時間。

本地緩存

在計算機世界中,緩存(Cache)無處不在,如CPU緩存、DNS緩存、瀏覽器緩存等。值得一提的是,Cache在我國臺灣地區(qū)被譯為“快取”,更直接地體現(xiàn)了它的用途:快速讀取。緩存的本質(zhì)是通過空間換時間的思路來保證數(shù)據(jù)的快速讀取。

業(yè)務(wù)服務(wù)一般需要通過網(wǎng)絡(luò)調(diào)用向其他服務(wù)或數(shù)據(jù)庫發(fā)送讀數(shù)據(jù)請求。為了提高數(shù)據(jù)的讀取效率,業(yè)務(wù)服務(wù)進程可以將已經(jīng)獲取到的數(shù)據(jù)緩存到本地內(nèi)存中,之后業(yè)務(wù)服務(wù)進程收到相同的數(shù)據(jù)請求時就可以直接從本地內(nèi)存中獲取數(shù)據(jù)返回,將網(wǎng)絡(luò)請求轉(zhuǎn)化為高效的內(nèi)存存取邏輯。

這就是本地緩存的主要用途。在本書后面的核心服務(wù)設(shè)計篇中會大量應(yīng)用本地緩存,本節(jié)先重點介紹本地緩存的技術(shù)原理。

基本的緩存淘汰策略

雖然緩存使用空間換時間可以提高數(shù)據(jù)的讀取效率,但是內(nèi)存資源的珍貴決定了本地緩存不可無限擴張,需要在占用空間和節(jié)約時間之間進行權(quán)衡。這就要求本地緩存能自動淘汰一些緩存的數(shù)據(jù),淘汰策略應(yīng)該盡量保證淘汰不再被使用的數(shù)據(jù),保證有較高的緩存命中率。基本的緩存淘汰策略如下。

  • FIFO(First In First Out)策略: 優(yōu)先淘汰最早進入緩存的數(shù)據(jù)。這是最簡單的淘汰策略,可以基于隊列實現(xiàn)。但是此策略的緩存命中率較低,越是被頻繁訪問的數(shù)據(jù)是越早進入隊列的,于是會被越早地淘汰。此策略在實踐中很少使用。
  • LFU(Least Frequently Used)策略: 優(yōu)先淘汰最不常用的數(shù)據(jù)。LFU策略會為每條緩存數(shù)據(jù)維護一個訪問計數(shù),數(shù)據(jù)每被訪問一次,其訪問計數(shù)就加1,訪問計數(shù)最小的數(shù)據(jù)是被淘汰的目標(biāo)。此策略很適合緩存在短時間內(nèi)會被頻繁訪問的熱點數(shù)據(jù),但是最近最新緩存的數(shù)據(jù)總會被淘汰,而早期訪問頻率高但最近一直未被訪問的數(shù)據(jù)會長期占用緩存。
  • LRU(Least Recent Used)策略: 優(yōu)先淘汰緩存中最近最少使用的數(shù)據(jù)。此策略一般基于雙向鏈表和哈希表配合實現(xiàn)。雙向鏈表負責(zé)存儲緩存數(shù)據(jù),并總是將最近被訪問的數(shù)據(jù)放置在尾部,使緩存數(shù)據(jù)在雙向鏈表中按照最近訪問時間由遠及近排序,每次被淘汰的都是位于雙向鏈表頭部的數(shù)據(jù)。哈希表負責(zé)定位數(shù)據(jù)在雙向鏈表中的位置,以便實現(xiàn)快速數(shù)據(jù)訪問。此策略可以有效提高短期內(nèi)熱點數(shù)據(jù)的緩存命中率,但如果是偶發(fā)性地訪問冷數(shù)據(jù),或者批量訪問數(shù)據(jù),則會導(dǎo)致熱點數(shù)據(jù)被淘汰,進而降低緩存命中率。

LRU策略和LFU策略的缺點是都會導(dǎo)致緩存命中率大幅下降。近年來,業(yè)界出現(xiàn)了一些更復(fù)雜、效果更好的緩存淘汰策略,比如W-TinyLFU策略。

分布式緩存

由于本地緩存把數(shù)據(jù)緩存在服務(wù)進程的內(nèi)存中,不需要網(wǎng)絡(luò)開銷,故而性能非常高。但是把數(shù)據(jù)緩存到內(nèi)存中也有較多限制,舉例如下。

  • 無法共享: 多個服務(wù)進程之間無法共享本地緩存。
  • 編程語言限制: 本地緩存與程序綁定,用Golang語言開發(fā)的本地緩存組件不可以直接為用Java語言開發(fā)的服務(wù)器所使用。
  • 可擴展性差: 由于服務(wù)進程攜帶了數(shù)據(jù),因此服務(wù)是有狀態(tài)的。有狀態(tài)的服務(wù)不具備較好的可擴展性。
  • 內(nèi)存易失性: 服務(wù)進程重啟,緩存數(shù)據(jù)全部丟失。

我們需要一種支持多進程共享、與編程語言無關(guān)、可擴展、數(shù)據(jù)可持久化的緩存,這種緩存就是分布式緩存。

分布式緩存選型

主流的分布式緩存開源項目有Memcached和Redis,兩者都是優(yōu)秀的緩存產(chǎn)品,并且都具有緩存數(shù)據(jù)共享、與編程語言無關(guān)的能力。不過,相對于Memcached而言,Redis更為流行,主要體現(xiàn)如下。

  • 數(shù)據(jù)類型豐富: Memcached僅支持字符串?dāng)?shù)據(jù)類型緩存,而Redis支持字符串、列表、集合、哈希、有序集合等數(shù)據(jù)類型緩存。
  • 數(shù)據(jù)可持久化: Redis通過RDB機制和AOF機制支持?jǐn)?shù)據(jù)持久化,而Memcached沒有數(shù)據(jù)持久化能力。
  • 高可用性: Redis支持主從復(fù)制模式,在服務(wù)器遇到故障后,它可以通過主從切換操作保證緩存服務(wù)不間斷。Redis具有較高的可用性。
  • 分布式能力: Memcached本身并不支持分布式,因此只能通過客戶端,以一致性哈希這樣的負載均衡算法來實現(xiàn)基于Memcached的分布式緩存系統(tǒng)。而Redis有官方出品的無中心分布式方案Redis Cluster,業(yè)界也有豆瓣Codis和推特Twemproxy的中心化分布式方案。

由于Redis支持豐富的數(shù)據(jù)類型和數(shù)據(jù)持久化,同時擁有高可用性和高可擴展性,因此它成為大部分互聯(lián)網(wǎng)應(yīng)用分布式緩存的首選。

如何使用Redis緩存

使用Redis緩存的邏輯如下。

  • 嘗試在Redis緩存中查找數(shù)據(jù),如果命中緩存,則返回數(shù)據(jù)。
  • 如果在Redis緩存中找不到數(shù)據(jù),則從數(shù)據(jù)庫中讀取數(shù)據(jù)。
  • 將從數(shù)據(jù)庫中讀取到的數(shù)據(jù)保存到Redis緩存中,并為此數(shù)據(jù)設(shè)置一個過期時間。
  • 下次在Redis緩存中查找同樣的數(shù)據(jù),就會命中緩存。

將數(shù)據(jù)保存到Redis緩存時,需要為數(shù)據(jù)設(shè)置一個合適的過期時間,這樣做有以下兩個好處。

  • 如果沒有為緩存數(shù)據(jù)設(shè)置過期時間,那么數(shù)據(jù)會一直堆積在Redis內(nèi)存中,尤其是那些不再被訪問或者命中率極低的緩存數(shù)據(jù),它們一直占據(jù)Redis內(nèi)存會造成大量的資源浪費。設(shè)置過期時間可以使Redis自動刪除那些不再被訪問的緩存數(shù)據(jù),而對于經(jīng)常被訪問的緩存數(shù)據(jù),每次被訪問時都重置過期時間,可以保證緩存命中率高。
  • 當(dāng)數(shù)據(jù)庫與Redis緩存由于各種故障出現(xiàn)了數(shù)據(jù)不一致的情況時,過期時間是一個很好的兜底手段。例如,設(shè)置緩存數(shù)據(jù)的過期時間為10s,那么數(shù)據(jù)庫和Redis緩存即使出現(xiàn)數(shù)據(jù)不一致的情況,最多也就持續(xù)10s。過期時間可以保證數(shù)據(jù)庫和Redis緩存僅在此時間段內(nèi)有數(shù)據(jù)不一致的情況,因此可以保證數(shù)據(jù)的最終一致性。

在上述邏輯中,有一個極有可能帶來風(fēng)險的操作:某請求訪問的數(shù)據(jù)在Redis緩存中不存在,此請求會訪問數(shù)據(jù)庫讀取數(shù)據(jù);而如果有大量的請求訪問數(shù)據(jù)庫,則可能導(dǎo)致數(shù)據(jù)庫崩潰。Redis緩存中不存在某數(shù)據(jù),只可能有兩種原因:一是在Redis緩存中從未存儲過此數(shù)據(jù),二是此數(shù)據(jù)已經(jīng)過期。下面我們就這兩種原因來做有針對性的優(yōu)化。

緩存穿透

當(dāng)用戶試圖請求一條連數(shù)據(jù)庫中都不存在的非法數(shù)據(jù)時,Redis緩存會顯得形同虛設(shè)。

  • 嘗試在Redis緩存中查找此數(shù)據(jù),如果命中,則返回數(shù)據(jù)。
  • 如果在Redis緩存中找不到此數(shù)據(jù),則從數(shù)據(jù)庫中讀取數(shù)據(jù)。
  • 如果在數(shù)據(jù)庫中也找不到此數(shù)據(jù),則最終向用戶返回空數(shù)據(jù)

可以看到,Redis緩存完全無法阻擋此類請求直接訪問數(shù)據(jù)庫。如果黑客惡意持續(xù)發(fā)起請求來訪問某條不存在的非法數(shù)據(jù),那么這些非法請求會全部穿透Redis緩存而直接訪問數(shù)據(jù)庫,最終導(dǎo)致數(shù)據(jù)庫崩潰。這種情況被稱為“緩存穿透”。

為了防止出現(xiàn)緩存穿透的情況,當(dāng)在數(shù)據(jù)庫中也找不到某數(shù)據(jù)時,可以在Redis緩存中為此數(shù)據(jù)保存一個空值,用于表示此數(shù)據(jù)為空。這樣一來,之后對此數(shù)據(jù)的請求均會被Redis緩存攔截,從而阻斷非法請求對數(shù)據(jù)庫的騷擾。

不過,如果黑客訪問的不是一條非法數(shù)據(jù),而是大量不同的非法數(shù)據(jù),那么此方案會使得Redis緩存中存儲大量無用的空數(shù)據(jù),甚至?xí)鸪鲚^多的合法數(shù)據(jù),大大降低了Redis緩存命中率,數(shù)據(jù)庫再次面臨風(fēng)險。我們可以使用布隆過濾器來解決緩存穿透問題。

布隆過濾器由一個固定長度為m的二進制向量和k個哈希函數(shù)組成。當(dāng)某數(shù)據(jù)被加入布隆過濾器中后,k個哈希函數(shù)為此數(shù)據(jù)計算出k個哈希值并與m取模,并且在二進制向量對應(yīng)的N個位置上設(shè)置值為1;如果想要查詢某數(shù)據(jù)是否在布隆過濾器中,則可以通過相同的哈希計算后在二進制向量中查看這k個位置值:

  • 如果有任意一個位置值為0,則說明被查詢的數(shù)據(jù)一定不存在;
  • 如果所有的位置值都為1,則說明被查詢的數(shù)據(jù)可能存在。之所以說可能存在,是因為哈希函數(shù)免不了會有數(shù)據(jù)碰撞的可能,在這種情況下會造成對某數(shù)據(jù)的誤判,不過可以通過調(diào)整m和k的值來降低誤判率。

雖然布隆過濾器對于“數(shù)據(jù)存在”有一定的誤判,但是對于“數(shù)據(jù)不存在”的判定是準(zhǔn)確的。布隆過濾器很適合用來防止緩存穿透:將數(shù)據(jù)庫中的全部數(shù)據(jù)加入布隆過濾器中,當(dāng)用戶請求訪問某數(shù)據(jù)但是在Redis緩存中找不到時,檢查布隆過濾器中是否記錄了此數(shù)據(jù)。

如果布隆過濾器認為數(shù)據(jù)不存在,則用戶請求不再訪問數(shù)據(jù)庫;如果布隆過濾器認為數(shù)據(jù)可能存在,則用戶請求繼續(xù)訪問數(shù)據(jù)庫;如果在數(shù)據(jù)庫中找不到此數(shù)據(jù),則在Redis緩存中設(shè)置空值。雖然布隆過濾器對“數(shù)據(jù)存在”有一定的誤判,但是誤判率較低。最后在Redis緩存中設(shè)置的空值也很少,不會影響Redis緩存命中率。

緩存雪崩

如果在同一時間Redis緩存中的數(shù)據(jù)大面積過期,則會導(dǎo)致請求全部涌向數(shù)據(jù)庫。這種情況被稱為“緩存雪崩”。緩存雪崩與緩存穿透的區(qū)別是,前者是很多緩存數(shù)據(jù)不存在造成的,后者是一條緩存數(shù)據(jù)不存在導(dǎo)致的。

緩存雪崩一般有兩種誘因:大量數(shù)據(jù)有相同的過期時間,或者Redis服務(wù)宕機。第一種誘因的解決方案比較簡單,可以在為緩存數(shù)據(jù)設(shè)置過期時間時,讓過期時間的值在預(yù)設(shè)的小范圍內(nèi)隨機分布,避免大部分緩存數(shù)據(jù)有相同的過期時間。第二種誘因取決于Redis的可用性,選取高可用的Redis集群架構(gòu)可以極大地降低Redis服務(wù)宕機的概率。

高并發(fā)讀場景總結(jié):CQRS

無論是數(shù)據(jù)庫讀/寫分離、本地緩存還是分布式緩存,其本質(zhì)上都是讀/寫分離,這也是在微服務(wù)架構(gòu)中經(jīng)常被提及的CQRS模式。CQRS(Command Query Responsibility  Segregation,命令查詢職責(zé)分離)是一種將數(shù)據(jù)的讀取操作與更新操作分離的模式。query指的是讀取操作,而command是對會引起數(shù)據(jù)變化的操作的總稱,新增、刪除、修改這些操作都是命令。

CQRS的簡要架構(gòu)與實現(xiàn)

為了避免引入微服務(wù)領(lǐng)域驅(qū)動設(shè)計的相關(guān)概念,下圖給出了CQRS的簡要架構(gòu)。

  • 當(dāng)業(yè)務(wù)服務(wù)收到客戶端發(fā)起的command請求(即寫請求)時,會將此請求交給寫數(shù)據(jù)存儲來處理。
  • 寫數(shù)據(jù)存儲完成數(shù)據(jù)變更后,將數(shù)據(jù)變更消息發(fā)送到消息隊列。
  • 讀數(shù)據(jù)存儲負責(zé)監(jiān)聽消息隊列,當(dāng)它收到數(shù)據(jù)變更消息后,將數(shù)據(jù)寫入自身。
  • 當(dāng)業(yè)務(wù)服務(wù)收到客戶端發(fā)起的query請求(即讀請求)時,將此請求交給讀數(shù)據(jù)存儲來處理。
  • 讀數(shù)據(jù)存儲將此請求希望訪問的數(shù)據(jù)返回。

寫數(shù)據(jù)存儲、讀數(shù)據(jù)存儲、數(shù)據(jù)傳輸通道均是較為寬泛的代稱,其中寫數(shù)據(jù)存儲和讀數(shù)據(jù)存儲在不同的高并發(fā)場景下有不同的具體指代,數(shù)據(jù)傳輸通道在不同的高并發(fā)場景下有不同的形式體現(xiàn),可能是消息隊列、定時任務(wù)等。

  • 對于數(shù)據(jù)庫讀/寫分離來說,寫數(shù)據(jù)存儲是 Master,讀數(shù)據(jù)存儲是 Slave,消息隊列的實現(xiàn)形式是數(shù)據(jù)庫主從復(fù)制。
  • 對于分布式緩存場景來說,寫數(shù)據(jù)存儲是數(shù)據(jù)庫,讀數(shù)據(jù)存儲是 Redis 緩存,消息隊列的實現(xiàn)形式是使用消息中間件監(jiān)聽數(shù)據(jù)庫的binlog數(shù)據(jù)變更日志。

無論是何種場景,都應(yīng)該為寫數(shù)據(jù)存儲選擇適合高并發(fā)寫入的存儲系統(tǒng),為讀數(shù)據(jù)存儲選擇適合高并發(fā)讀取的存儲系統(tǒng),消息隊列作為數(shù)據(jù)傳輸通道要足夠健壯,保證數(shù)據(jù)不丟失。

責(zé)任編輯:姜華 來源: 冰河技術(shù)
相關(guān)推薦

2024-05-27 08:32:45

2025-06-05 09:08:43

2019-04-22 08:07:31

MySQL數(shù)據(jù)庫索引

2011-07-04 10:00:02

虛擬化

2011-06-29 10:08:24

服務(wù)器虛擬化解決方案

2010-01-15 09:43:49

Windows 7殺手

2020-02-19 13:39:14

操作系統(tǒng)WindowsLinux

2012-12-19 13:00:36

飛魚星WLANVF16

2010-03-23 17:06:01

2015-06-15 14:48:21

蘋果iOS9軟實力

2022-02-25 08:55:19

BitMapRedis面試題

2021-04-28 08:52:22

高并發(fā)架構(gòu)設(shè)高并發(fā)系統(tǒng)

2025-01-12 13:06:45

2019-08-29 10:46:42

2022-02-10 09:04:18

RediSDS數(shù)據(jù)結(jié)構(gòu)

2014-12-01 15:20:36

微信點評商家

2025-08-22 09:06:57

2011-12-20 10:16:49

2015-08-11 14:38:34

2011-06-27 22:08:42

臺式機評測
點贊
收藏

51CTO技術(shù)棧公眾號

日韩欧美高清dvd碟片| 美女视频免费一区| 亚洲精品美女视频| 美女福利视频在线| 成年人在线观看视频| 国产中文一区二区三区| 欧美日本亚洲视频| 日本高清成人免费播放| 国产精国产精品| 久久久精品少妇| 国产一区在线电影| 欧美日韩视频在线一区二区| 国产爆乳无码一区二区麻豆| 天堂在线中文| 亚洲免费视频二区| 999久久久精品一区二区| 欧美午夜影院在线视频| 强伦女教师2:伦理在线观看| 性感美女一级片| 久久99精品国产麻豆不卡| 国语自产精品视频在线看| 亚洲成人免费在线视频| 国产精品传媒毛片三区| 波多野结衣一区二区三区四区| 欧美freesex交免费视频| 国产亚洲精品美女| 一本色道久久hezyo无码| 久久不卡日韩美女| 色综合久久久久综合99| 九一国产精品视频| 伊人手机在线| 国产精品第四页| 日韩精品一区二区三区色偷偷 | 欧美 亚欧 日韩视频在线 | 色呦呦在线视频| 欧美国产禁国产网站cc| 久久综合给合久久狠狠色| 99国产揄拍国产精品| 欧美a级理论片| 清纯唯美日韩制服另类| 精品国产免费观看| 国内精品久久久久久久97牛牛 | 蜜臀va亚洲va欧美va天堂| 国产精品大片免费观看| 亚洲一区二区三区四区在线| 在线观看一区二区三区三州 | 91精品国产自产观看在线| 在线精品视频一区二区三四 | 欧美bbbbb性bbbbb视频| 亚洲av成人精品毛片| 国产福利一区在线| 91超碰rencao97精品| 国产精品久久免费| 精品在线一区二区三区| 成人免费在线视频网址| 国产欧美第一页| 国产伦精品一区二区三区免费迷| 91视频免费在线| 国产精品视频在线观看免费| 精品亚洲aⅴ乱码一区二区三区| 国产日本欧美视频| 一区二区日韩视频| 精品亚洲国内自在自线福利| 91九色单男在线观看| 国产av无码专区亚洲a∨毛片| 国产在线看一区| 91九色蝌蚪成人| 天堂成人在线视频| 91色乱码一区二区三区| 日本一区二区三区免费观看| 在线观看二区| 最新欧美精品一区二区三区| 好吊色视频988gao在线观看| av在线不卡免费| 色欧美日韩亚洲| 男女视频在线看| 国产精品一区二区精品视频观看 | 高清欧美性猛交xxxx| 中日韩黄色大片| 视频在线观看91| 国产欧美精品一区二区| 亚洲第一视频在线| 久久丝袜美腿综合| 一本色道久久综合亚洲精品婷婷| av电影高清在线观看| 午夜久久久影院| 男女爽爽爽视频| 日韩在线视频一区二区三区| 日韩国产在线播放| 黄色一级片一级片| 好吊日精品视频| 国产精品91在线观看| 国产视频在线免费观看| 99免费精品视频| 一本色道久久综合亚洲二区三区 | 人妻激情偷乱频一区二区三区| 亚洲精品一级二级三级| 日韩一区视频在线| 日韩av在线播放观看| 麻豆精品一区二区三区| 国产高清自拍99| 大片免费播放在线视频| 亚洲国产美国国产综合一区二区| 能看的毛片网站| 伊人精品综合| 日韩午夜在线视频| 精品91久久久| 国产在线国偷精品产拍免费yy | 99久久www免费| 2019中文字幕在线| 99精品在线看| 中文字幕欧美区| 无码人妻精品一区二区三区在线| 国产激情一区| 在线播放国产一区中文字幕剧情欧美| 国产一级在线视频| 黑人巨大精品欧美黑白配亚洲| 国产一区二区精品在线| av色综合久久天堂av色综合在| 色天天综合久久久久综合片| www.com日本| 久久久9色精品国产一区二区三区| 国产成人亚洲精品| 手机在线精品视频| 一区二区三区中文字幕电影| 亚欧激情乱码久久久久久久久| 亚洲欧美tv| 97在线视频免费观看| 91女人18毛片水多国产| 欧美激情一区三区| 日韩av资源在线| 狠狠久久伊人| 国模精品系列视频| 精品人妻一区二区三区换脸明星| 国产精品免费人成网站| 爱情岛论坛成人| 欧美女优在线视频| 日本不卡视频在线播放| 亚洲aaaaaaa| 欧美日韩国产色| 在线免费观看污视频| 影音先锋国产精品| 国产不卡一区二区在线观看| 亚洲按摩av| 日韩欧美国产电影| 青娱乐国产盛宴| 丁香婷婷综合色啪| 日韩 欧美 视频| 国产毛片久久久| 性欧美视频videos6一9| 无码精品在线观看| 精品magnet| aaaaa级少妇高潮大片免费看| 99在线精品免费视频九九视| 久久99精品久久久久久秒播放器 | 欧美色图在线视频| 亚洲欧美视频在线播放| 久久精品男女| 色姑娘综合网| 亚洲欧美久久精品| 欧美成人免费大片| 免费国产精品视频| 大伊人狠狠躁夜夜躁av一区| 精品无人区无码乱码毛片国产| 美女黄网久久| 亚洲综合网中心| 午夜精品在线| 国产成人91久久精品| aⅴ在线视频男人的天堂| 欧美精品日韩综合在线| 欧美成人一二三区| 99视频国产精品| 91色国产在线| 午夜精品久久| 免费国产一区二区| 欧美综合社区国产| 欧美国产视频一区二区| 久久免费看视频| 欧美精品色综合| 国产成人免费观看视频 | 桃子视频成人app| 久久精品99久久久香蕉| 亚洲毛片欧洲毛片国产一品色| 欧美午夜宅男影院在线观看| 欧美成人短视频| 国v精品久久久网| 无码少妇一区二区三区芒果| 91精品动漫在线观看| 极品日韩久久| 99视频这里有精品| 97久久精品国产| 好操啊在线观看免费视频| 亚洲国产免费av| 国产精品伦理一区| 丰满岳妇乱一区二区三区| 免费精品在线视频| av电影在线观看一区| 免费一区二区三区在线观看| 亚洲毛片网站| 中文字幕一区综合| 网友自拍一区| 99久久综合狠狠综合久久止| 国产一区二区主播在线| 久久久久国产精品一区| 青青青青在线| 亚洲美女免费精品视频在线观看| 国产欧美第一页| 欧美日韩一区二区欧美激情 | 伊人久久亚洲美女图片| 亚洲天堂av免费在线观看| 伊人久久大香线蕉无限次| 成人黄色片视频网站| 日本一区二区中文字幕| 国产999在线| 波多野结衣久久| 久久的精品视频| 成年人在线视频免费观看| 日韩成人在线视频观看| 国产成人精品无码高潮| 欧美日韩国产首页| 无码人妻精品一区二| 亚洲va国产va欧美va观看| 永久看片925tv| 一区二区中文视频| 蜜桃久久精品成人无码av| av福利精品导航| 无码av免费精品一区二区三区| 国产自产高清不卡| 欧美日韩亚洲自拍| 日本欧美加勒比视频| 国产男女无遮挡| 一区二区三区成人精品| av免费看网址| 在线国产欧美| 97在线国产视频| 国产精品v欧美精品v日本精品动漫| 婷婷视频在线播放| 99热国内精品永久免费观看| 亚洲一区二区三区欧美| 日韩专区精品| 中文字幕成人一区| 91精品推荐| www.黄色网址.com| 午夜国产欧美理论在线播放| 51xx午夜影福利| 欧美精品91| 日韩一级免费看| 国产精品扒开腿做爽爽爽软件| 久久这里只有精品8| 伊人久久亚洲影院| 成人毛片视频网站| 99精品福利视频| 男女av免费观看| 日韩成人伦理电影在线观看| 成年网站在线播放| 久久精品免费观看| 亚洲一级片免费观看| 岛国精品一区二区| 亚洲色图14p| 中文无字幕一区二区三区| 国产又粗又长免费视频| 亚洲精品福利视频网站| 国产精品1234区| 色偷偷久久一区二区三区| 中文区中文字幕免费看| 欧美日韩美女一区二区| 国产色综合视频| 欧美精品一区二区在线播放| 女人偷人在线视频| 色妞一区二区三区| 乱插在线www| 欧美最近摘花xxxx摘花| 精品久久毛片| www.av一区视频| 蜜桃精品噜噜噜成人av| 一区二区三区四区五区精品| 欧美三级午夜理伦三级中文幕| 久久久久久久久久久视频| 日本中文字幕不卡| 手机在线播放av| 久久蜜桃香蕉精品一区二区三区| 特黄一区二区三区| 夜夜操天天操亚洲| 日韩中文字幕在线观看视频| 欧美精品aⅴ在线视频| 熟妇人妻中文av无码| 伊人久久免费视频| 毛片网站在线看| 国产精品免费视频xxxx| 亚洲天堂中文字幕在线观看| 日韩成人av网站| 亚洲精品成人电影| 91久久国产综合久久| 国产麻豆91视频| 日韩精品免费一线在线观看| 日本在线免费中文字幕| 午夜精品久久17c| 全球中文成人在线| 欧美电影精品一区二区| 国产精品熟女视频| 日韩欧美国产电影| 成人在线观看网站| 国内精品在线一区| 亚洲欧洲日韩精品在线| 久久亚洲综合网| 高清一区二区中文字幕| 最近中文字幕mv在线一区二区三区四区| av电影免费在线观看| 国产精品黄视频| 欧美成人一区在线观看| 特级黄色录像片| 日日夜夜精品视频免费| 妖精视频一区二区| 超碰成人免费| 亚洲xxxxx电影| av在线不卡顿| av动漫在线观看| 成人激情av网| 一级黄色录像视频| 欧美裸体bbwbbwbbw| 91成品人影院| 91老司机福利 在线| 欧美风情第一页| 欧美三级日韩在线| 暖暖视频在线免费观看| 国内自拍欧美激情| 亚洲日本va| 免费观看国产视频在线| 日韩母乳在线| 欧美一级bbbbb性bbbb喷潮片| 无人区乱码一区二区三区| 自拍偷拍视频在线| 麻豆成人久久精品二区三区红| 可以直接看的无码av| 午夜精品久久久久久久99樱桃| 亚洲精品97久久中文字幕| 欧美久久精品一级黑人c片| 亚洲欧美久久精品| 国产卡一卡二在线| 国产在线观看一区二区| 国产稀缺精品盗摄盗拍| 7777精品伊人久久久大香线蕉 | 精品国产露脸精彩对白| 国产精品扒开做爽爽爽的视频 | 国产乱子夫妻xx黑人xyx真爽| yourporn久久国产精品| 久热精品在线观看| 精品国产污污免费网站入口 | 欧美唯美清纯偷拍| 成人h小游戏| 国产日本欧美视频| 综合激情一区| 中文在线字幕观看| 亚洲第一激情av| 三级视频网站在线| 国产精品激情自拍| 日韩久久电影| 伦伦影院午夜理论片| 亚洲欧美一区二区三区久本道91| 精品久久久久久亚洲综合网站| 欧美激情国产精品| 乱亲女h秽乱长久久久| 青青视频在线播放| 欧美激情一区二区三区四区| 91中文字幕在线视频| 精品自在线视频| 国产香蕉精品| 美女黄色片视频| 亚洲欧美成aⅴ人在线观看| 国产 日韩 欧美 精品| 欧美一二三视频| 国产精品国产一区| 91丨porny丨对白| 欧洲激情一区二区| 国产乱色在线观看| 国产一区免费视频| 免费在线看成人av| 麻豆疯狂做受xxxx高潮视频| 国产美女在线观看一区| 亚洲毛片aa| 免费日本视频一区| 永久免费看黄网站| 亚洲精品丝袜日韩| 成人综合日日夜夜| av动漫在线看| 国产精品国产三级国产有无不卡| 亚洲国产av一区二区| 国产精品第一页在线| 国产精品观看| 亚欧精品视频一区二区三区| 日韩免费一区二区三区在线播放| 免费福利视频一区二区三区| 浴室偷拍美女洗澡456在线| 久久久久久久综合日本| 国产老头老太做爰视频| 欧美婷婷在线| 国模私拍视频一区| 成人免费视频| 亚洲aaaaaa| 久久久久国内|