<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ????程序員修神之路--聽(tīng)說(shuō)你會(huì)緩存?

          共 3227字,需瀏覽 7分鐘

           ·

          2020-09-15 10:25


          靈魂拷問(wèn)

          • 緩存是什么?(沒(méi)聽(tīng)說(shuō)過(guò)你可以走了)
          • 哪些場(chǎng)景需要用到緩存呢?
          • 緩存可以分類(lèi)嗎?
          • 緩存的實(shí)現(xiàn)方式有哪些?

          緩存

          緩存也被稱(chēng)為Cache,本質(zhì)上是數(shù)據(jù)交換的一段緩沖區(qū),也可以稱(chēng)為一種存儲(chǔ)數(shù)據(jù)的組件,緩存主要用于減小數(shù)據(jù)交換雙方速度不匹配的問(wèn)題。

          緩存在計(jì)算機(jī)世界里是一個(gè)常見(jiàn)并且不可忽視的一個(gè)重要因素,它幾乎遍布于你所知的各個(gè)領(lǐng)域。例如cpu的一級(jí)緩存,二級(jí)緩存;瀏覽器的緩存等。我們?cè)谑褂镁彺娴臅r(shí)候要清除的認(rèn)識(shí)到緩存的數(shù)據(jù)是有有效期的,也就是說(shuō)可能隨時(shí)會(huì)消失。有的同學(xué)會(huì)說(shuō)了,類(lèi)似redis這些組件都提供了數(shù)據(jù)持久化的功能,這樣數(shù)據(jù)就不會(huì)消失了。至于這個(gè)問(wèn)題其實(shí)我想說(shuō)兩點(diǎn):

          • 當(dāng)組件提供了持久化功能的時(shí)候,必然會(huì)發(fā)生磁盤(pán)的IO操作,而磁盤(pán)IO的操作必然會(huì)大大降低緩存組件的性能,那緩存的價(jià)值還有嗎?
          • 緩存的數(shù)據(jù)在時(shí)間定義上是一種臨時(shí)性的數(shù)據(jù),如果做了持久化,這種臨時(shí)性的意義就不存在了,而且還占用了磁盤(pán)的存儲(chǔ)空間

          緩存最常見(jiàn)的存儲(chǔ)介質(zhì)是內(nèi)存,但這并不意味只有內(nèi)存可以存儲(chǔ)緩存數(shù)據(jù),這也是初學(xué)者經(jīng)常會(huì)犯的錯(cuò)誤。緩存的作用是提供高速的讀寫(xiě)功能,所以如果你的設(shè)備足夠快,理論上都可以作為緩存使用,比如現(xiàn)在的SSD,在一些性能不太嚴(yán)格和敏感的場(chǎng)景下就可以作為存儲(chǔ)緩存數(shù)據(jù)的介質(zhì),至于計(jì)算機(jī)的各種硬件之間的速度差距可以參考之前的文章:

          高并發(fā)下為什么更喜歡進(jìn)程內(nèi)緩存

          緩存應(yīng)用場(chǎng)景

          從理論上來(lái)說(shuō),任何需要提高訪(fǎng)問(wèn)速度的環(huán)節(jié)都可以加入緩存

          但是系統(tǒng)加入緩存模塊會(huì)在一定程度上增加系統(tǒng)的復(fù)雜度,所以在是否引入緩存的問(wèn)題上,需要根據(jù)業(yè)務(wù)場(chǎng)景來(lái)平衡。一般符合以下幾種特征的數(shù)據(jù)可以考慮引入緩存模塊:

          數(shù)據(jù)很少變動(dòng)

          這類(lèi)數(shù)據(jù)最適合緩存的應(yīng)用場(chǎng)景,因?yàn)樗静簧婕暗截?fù)責(zé)的緩存更新操作,所以只要將其加載到緩存中即可。最具有代表性的像網(wǎng)站用到的js,css等這些靜態(tài)資源,用戶(hù)登錄之后生成的session信息等。

          說(shuō)到數(shù)據(jù)很少變動(dòng),不得不提CDN這種服務(wù)了,很多大型網(wǎng)站都會(huì)利用CDN來(lái)加速一些不變資源的訪(fǎng)問(wèn)速度,比如一些圖片,視頻等。由于用戶(hù)訪(fǎng)問(wèn)這些資源的本源需要跨越多個(gè)主干網(wǎng),在速度上較慢,而CDN恰恰彌補(bǔ)了這個(gè)缺陷,所以這里也可以把CDN看成是一種緩存的服務(wù)。

          熱點(diǎn)數(shù)據(jù)

          這種數(shù)據(jù)是我們平時(shí)開(kāi)發(fā)中要加緩存的主要原因數(shù)據(jù),最有可能導(dǎo)致系統(tǒng)癱瘓的也是這種數(shù)據(jù)。它最大的特點(diǎn)是發(fā)生時(shí)間不確定,流量峰值不確定。大家可能還依稀記得微博因?yàn)閮蓚€(gè)明星出軌而掛掉的事件,雖然微博的系統(tǒng)架構(gòu)后來(lái)經(jīng)過(guò)改造可以同時(shí)抗住N個(gè)明星出軌,但是在不確定這個(gè)因素上依然無(wú)能為力。

          熱點(diǎn)數(shù)據(jù)的緩存并不容易設(shè)計(jì),因?yàn)樗鼛в袉吸c(diǎn)屬性,什么意思呢?假設(shè)我們的緩存服務(wù)器有100個(gè)節(jié)點(diǎn),這個(gè)時(shí)候發(fā)生了某個(gè)熱點(diǎn)新聞,而這個(gè)熱點(diǎn)新聞的緩存在0號(hào)節(jié)點(diǎn),大量的請(qǐng)求會(huì)被路由到0號(hào)節(jié)點(diǎn),很有可能會(huì)導(dǎo)致0號(hào)節(jié)點(diǎn)垮掉,如果0號(hào)節(jié)點(diǎn)垮掉,基于故障轉(zhuǎn)移策略,流量瞬間會(huì)轉(zhuǎn)移到另外一個(gè)節(jié)點(diǎn),然后這個(gè)節(jié)點(diǎn)會(huì)垮掉,以此類(lèi)推.....緩存雖然提高了系統(tǒng)的整體吞吐量,但是在應(yīng)對(duì)有針對(duì)性的流量高峰的時(shí)候需要單獨(dú)針對(duì)。這其實(shí)也是分布式系統(tǒng)要解決的問(wèn)題,既然一個(gè)節(jié)點(diǎn)扛不住流量高峰,系統(tǒng)可以設(shè)計(jì)多個(gè)節(jié)點(diǎn)一起來(lái)抗,至于以上的熱點(diǎn)數(shù)據(jù)場(chǎng)景,最簡(jiǎn)單粗暴的方式就是緩存副本,一份緩存數(shù)據(jù)會(huì)存在多份副本,類(lèi)似于MySQL的讀寫(xiě)分離方案,多份副本同時(shí)提供讀取操作。除此之外,這種場(chǎng)景下我推薦使用進(jìn)程內(nèi)緩存代替分布式緩存,因?yàn)檫M(jìn)程內(nèi)緩存在訪(fǎng)問(wèn)速度上要比需要跨越網(wǎng)絡(luò)的分布式緩存要快很多,具體可以查看之前的推文:

          高并發(fā)下為什么更喜歡進(jìn)程內(nèi)緩存

          耗時(shí)操作

          某些計(jì)算代價(jià)或者獲取代價(jià)很大的數(shù)據(jù)在特定的條件下也適合進(jìn)行緩存。為什么要加特定條件呢?如果系統(tǒng)對(duì)這些數(shù)據(jù)的一致性有著嚴(yán)格的要求,而且會(huì)頻繁的變動(dòng),雖然獲取數(shù)據(jù)代價(jià)比較大,但是你也要充分考慮緩存帶來(lái)的副作用。像我們最常用的報(bào)表服務(wù),一般生成報(bào)表都比較耗時(shí),如果報(bào)表的數(shù)據(jù)是相對(duì)穩(wěn)定的,那我們就可以考慮用緩存來(lái)提高系統(tǒng)的性能。

          緩存的淘汰

          存儲(chǔ)緩存的設(shè)備限制了緩存是有大小限制的,如果以16G內(nèi)存來(lái)存儲(chǔ)緩存,那緩存的上限理論上就是16G(但是實(shí)際上要小的多),而且緩存帶有時(shí)效性,所以當(dāng)要緩存的數(shù)據(jù)大于介質(zhì)容量的時(shí)候就需要一種淘汰數(shù)據(jù)的策略來(lái)保證新數(shù)據(jù)能正常被緩存。

          最好的淘汰策略就是把系統(tǒng)不用的數(shù)據(jù)淘汰出去,但是什么數(shù)據(jù)是無(wú)用數(shù)據(jù),這是策略的難點(diǎn)所在,基于用戶(hù)行為的不確定性,這種數(shù)據(jù)所以很難用程序去預(yù)測(cè)。鑒于系統(tǒng)的常規(guī)理論,現(xiàn)在主流的有以下幾種淘汰策略:

          • LFU(Least Frequently Used):緩存系統(tǒng)會(huì)記住每條緩存數(shù)據(jù)被訪(fǎng)問(wèn)的頻率,會(huì)優(yōu)先淘汰最不常用的數(shù)據(jù)。
          • LRU(Least Recently Used):緩存系統(tǒng)會(huì)記住每條數(shù)據(jù)最后的訪(fǎng)問(wèn)時(shí)間,會(huì)優(yōu)先淘汰長(zhǎng)時(shí)間未被訪(fǎng)問(wèn)的數(shù)據(jù)
          • ARC(Adaptive Replacement Cache):這個(gè)緩存算法同時(shí)跟蹤記錄LFU和LRU,以及驅(qū)逐緩存條目,來(lái)獲得可用緩存的最佳使用,它被認(rèn)為是性能最好的緩存算法之一,介于LRU和LFU之間,能夠記憶效果和自調(diào),當(dāng)然開(kāi)發(fā)肯定會(huì)比較復(fù)雜。
          • FIFO:基于隊(duì)列的原理的淘汰算法,先進(jìn)先出。這種算法比較簡(jiǎn)單,現(xiàn)實(shí)中使用比較少是因?yàn)檫@種業(yè)務(wù)場(chǎng)景比較少。

          緩存實(shí)現(xiàn)方式

          系統(tǒng)中實(shí)現(xiàn)緩存的方式大體上可以分為兩種:

          進(jìn)程內(nèi)緩存

          進(jìn)程內(nèi)緩存是指緩存和應(yīng)用程序在同一個(gè)進(jìn)程內(nèi),在獲取緩存數(shù)據(jù)的時(shí)候不需要跨越網(wǎng)絡(luò),所以進(jìn)程內(nèi)緩存是訪(fǎng)問(wèn)速度最快的一種方式。

          進(jìn)程內(nèi)緩存一般用在單機(jī)或者小型系統(tǒng)中,但是,在整體架構(gòu)實(shí)現(xiàn)了一致性的前提下,也可用于大型系統(tǒng),什么意思呢?舉個(gè)栗子:在多個(gè)服務(wù)器節(jié)點(diǎn)的情況下,假如用戶(hù)A的信息緩存在0號(hào)節(jié)點(diǎn),如果有一種機(jī)制能保證用戶(hù)A的所有請(qǐng)求都只會(huì)到達(dá)0號(hào)節(jié)點(diǎn),這個(gè)時(shí)候利用進(jìn)程內(nèi)緩存就完全沒(méi)有問(wèn)題。最典型的像Actor模型應(yīng)用,可以參見(jiàn)之前的文章

          分布式高并發(fā)下Actor模型如此優(yōu)秀?

          進(jìn)程外緩存

          顧名思義,進(jìn)程外緩存的意思是緩存數(shù)據(jù)和應(yīng)用程序是隔離的,位于不同的進(jìn)程內(nèi)。當(dāng)然這里又可以把進(jìn)程外緩存劃分為單機(jī)版和分布式版本,單機(jī)版本這里就不多說(shuō)了,會(huì)存在單機(jī)故障問(wèn)題。

          進(jìn)程外的分布式版本通常被稱(chēng)為分布式緩存,是基于分布式理論的一種架構(gòu)模式。它突破了單機(jī)緩存的容量限制和單機(jī)故障問(wèn)題,雖然在訪(fǎng)問(wèn)速度上比進(jìn)程內(nèi)緩存要慢很多,但是相比較磁盤(pán)IO操作要快的多,所以現(xiàn)在很多大型系統(tǒng)都喜歡用分布式緩存來(lái)提高性能。像用的最多的Redis在3.0版本之后就提供了集群方案。

          寫(xiě)在最后

          在面對(duì)緩存帶給系統(tǒng)的優(yōu)勢(shì)之后,也要注意到緩存也會(huì)有一些不足。

          • 緩存和數(shù)據(jù)源的一致性問(wèn)題
          • 緩存命中問(wèn)題
          • 緩存的雪崩穿透問(wèn)題
          • 緩存的并發(fā)競(jìng)爭(zhēng)問(wèn)題
          • 緩存適合讀多寫(xiě)少的系統(tǒng)
          • 引入緩存組件會(huì)給系統(tǒng)設(shè)計(jì)帶來(lái)一定的復(fù)雜度
          • 緩存會(huì)加大運(yùn)維的成功以及排查bug的成本

          雖然緩存帶來(lái)了不少問(wèn)題,但是相比較緩存帶給系統(tǒng)性能的提升是毋庸置疑的。我們?cè)谠O(shè)計(jì)一個(gè)高并發(fā)系統(tǒng)的時(shí)候,緩存已經(jīng)成為了一種必備設(shè)計(jì),在正確設(shè)計(jì)了緩存各種策略之后,才能最大發(fā)揮緩存的優(yōu)勢(shì)


          更多精彩文章



          福利時(shí)間(送3本
          分布式一致性算法開(kāi)發(fā)實(shí)戰(zhàn)

          《分布式一致性算法開(kāi)發(fā)實(shí)戰(zhàn)》分為11章,第1章簡(jiǎn)單介紹分布式一致性算法,第2章詳細(xì)分析Raft算法,第3章在第2章的基礎(chǔ)上進(jìn)行整體設(shè)計(jì),第4~8章逐個(gè)講解基于Raft算法的KV服務(wù)的各個(gè)組件的實(shí)現(xiàn),第9章講解日志快照,第10章是生產(chǎn)環(huán)境必需的服務(wù)器成員變更功能,第11章介紹一些相關(guān)的Raft算法優(yōu)化。


          非常感謝北京大學(xué)出版社

          對(duì)本次活動(dòng)的大力支持

          長(zhǎng)按以下菊花碼參加活動(dòng)

          (公眾號(hào)內(nèi)回復(fù)“福利”)

          瀏覽 27
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产微拍精品一区 | 久久 无码 一区二区三区四区 | 人人妻人人澡人人DⅤD | 亚洲最大免费在线播放视频 | 就要操AV |