成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

分布式系統(tǒng)關注點——360°全方位解讀「緩存」

alanoddsoff / 1123人閱讀

摘要:在一個成熟的系統(tǒng)中,能夠運用到緩存的地方其實并不是一處。那么在以終端用戶為起點,系統(tǒng)所用的數(shù)據(jù)庫為終點的這條道路上可以作為緩存設立點的位置大致有以下這些。緩存也有一系列的副作用需要考慮。

如果這是第二次看到我的文章,歡迎文末掃碼訂閱我個人的公眾號(跨界架構師)喲~  
本文長度為3578字,建議閱讀10分鐘。
堅持原創(chuàng),每一篇都是用心之作~

此前的「伸縮性」章節(jié)結束了,此文是「高性能」章節(jié)的第一篇。

只要是位正兒八經(jīng)的程序員自然知道「緩存」是什么,甚至我司的很多做運營的小姐姐現(xiàn)在和程序員小哥哥的交流中都時不時冒出「緩存」字眼,讓人壓力山大。(本文討論的「緩存」皆指的是軟件層面運用的緩存)

大家都知道的一點是,緩存可以讓原本打開很慢的頁面,變得能“秒開”。你平時訪問的APP、網(wǎng)站幾乎都有涉及到緩存的運用。

那么,緩存除了能加速數(shù)據(jù)的訪問之外,還有什么作用呢?

另外,任何事物都有兩面性,我們?nèi)绾尾拍軐⒕彺娴膬?yōu)點發(fā)揮得淋淋盡致,同時避免掉到它的弊端中呢?

Z哥今天想分享給你的就是我對緩存的理解和運用的思路,希望對你有所啟發(fā)。


「緩存」能做什么?

正如前面所說,大家最普遍的理解就是當我們遇到某個頁面打開很慢的時候,會想到引入緩存,這樣頁面打開就快了。

其實快和慢都是相對的,從技術角度來說,緩存之所以快是因為緩存是基于內(nèi)存去建立的,而內(nèi)存的讀寫速度比硬盤快X倍,所以用內(nèi)存來代替硬盤作為讀寫的介質自然能大大提高訪問數(shù)據(jù)的速度。

這個過程大致是這樣的,通過在內(nèi)存中存儲訪被問過的數(shù)據(jù)供后續(xù)訪問時使用,以此來達到提速的效果

其實除此之外,緩存還有另外2個重要的運用方式,「預讀取」和「延遲寫」。

預讀取

預讀取就是預先讀取將要載入的數(shù)據(jù),也可以稱作「緩存預熱」。就是在系統(tǒng)對外提供服務之前,先將硬盤中的一部分數(shù)據(jù)加載到內(nèi)存中,然后再對外提供服務。

為什么要這樣做呢?因為有些系統(tǒng)一旦啟動就要面臨上千上萬的請求進來(在一些toC的項目尤其如此),如果直接讓這些請求打到數(shù)據(jù)庫上,非常大的可能是數(shù)據(jù)庫壓力暴增,直接被干趴,無法正常響應。

為了緩解這個問題,需要通過「預讀取」來解決。

可能你會問,哪怕用了緩存還是扛不住呢?那就是做橫向擴展+負載均衡的時候到了。(可以點擊文末鏈接閱讀之前的《彈性架構》系列)


如果說「預讀取」是在「數(shù)據(jù)出口」加了一道前置的緩沖區(qū)的話,那么顧名思義,下面要說的「延遲寫」就是在「數(shù)據(jù)入口」后面加了一道后置的緩沖區(qū)。


延遲寫

你可能知道,數(shù)據(jù)庫的寫入速度是慢于讀取速度的,因為寫入的時候有一系列的保證數(shù)據(jù)準確性的機制。

所以,如果想提升寫入速度的話,要么做分庫分表,要么就是通過緩存來進行一道緩沖,再一次性批量寫到磁盤,以此來提速。

題外話:由于分庫分表對跨表操作以及多條件組合查詢的副作用巨大,所以引入它的復雜度遠大于引入緩存,我們應當優(yōu)先考慮引入緩存的方案。


那么,通過緩存機制來加速“寫”的過程就可以稱作「延遲寫」。就是預先將需要寫入到磁盤或者數(shù)據(jù)庫的數(shù)據(jù),先暫時寫入到內(nèi)存,然后就返回成功。再定時將內(nèi)存中的數(shù)據(jù)批量寫入到磁盤。

可能你會想,寫到內(nèi)存就認為成功,萬一中途出現(xiàn)意外、斷電、停機等導致程序異常終止的情況,數(shù)據(jù)不就丟了嗎?

是的。所以,「延遲寫」一般僅用于對數(shù)據(jù)完整性要求不是那么苛刻的場景。比如點贊數(shù)啊、參與用戶數(shù)啊等等,可以大大緩解對數(shù)據(jù)庫頻繁修改所帶來的壓力。

其實在我們熟知的分布式緩存Redis中,其默認運用的持久化機制——RDB,也是這樣的思路。


在一個成熟的系統(tǒng)中,能夠運用到緩存的地方其實并不是一處。下面Z哥就來幫你梳理一下我們在哪些地方可以“加緩存”。


哪里可以加「緩存」?

在說哪里可以加緩存之前我們先搞清楚一個事情,我們要緩存什么?也就是符合什么特點的數(shù)據(jù)才需要加緩存?畢竟加緩存是一個額外的成本投入,得物有所值。

一般來說你可以用這兩個標準來判斷:熱點(被高頻訪問,如幾十次/秒以上)數(shù)據(jù)、靜態(tài)(很少變化,讀遠大于寫,如幾天變更一次)數(shù)據(jù)。

接下去就可以替它們找到合適的地方加緩存了。


緩存的本質是一個“防御性”的機制,而系統(tǒng)之間的數(shù)據(jù)流轉是一個有序的過程。所以,選擇在哪里加緩存就相當于選擇在一條馬路的哪個位置設路障。在這個路障之后的道路都能受到保護,不被車流碾壓。

那么在以終端用戶為起點,系統(tǒng)所用的數(shù)據(jù)庫為終點的這條道路上可以作為緩存設立點的位置大致有以下這些。

每個設立點可以擋掉一些流量,最終形成一個漏斗狀的攔截效果,以此保護最后面的系統(tǒng)以及最終的數(shù)據(jù)庫。

下面Z哥來簡要描述下每一個的運用場景以及需要注意的點。

瀏覽器緩存

這是離用戶最近的可以作為緩存的地方,而且借助的是用戶的“資源”(緩存的數(shù)據(jù)在用戶的終端設備上),性價比可謂最好,讓用戶幫你分擔壓力。

當你打開瀏覽器的開發(fā)者工具,看到from cache或者from memory cache、from disk cache的時候,就意味著這些數(shù)據(jù)已經(jīng)被緩存在了用戶的終端設備上了(沒網(wǎng)的時候也能訪問到一部分內(nèi)容就是這個原因)。

這個過程是瀏覽器替我們完成的,一般用于緩存圖片、js、css這些。我們可以通過Http消息頭中的Cache-Control來控制它,具體細節(jié)這里就不展開了。

js里的全局變量、以及cookie等運用也屬于該范疇。

瀏覽器緩存是在于用戶側的緩存點,所以我們對其的掌控力就差很多,在沒有發(fā)起新請求的情況下,你無法主動去更新數(shù)據(jù)。


CDN緩存

提供CDN服務的服務商,在全國甚至是全球部署著大量的服務器節(jié)點(可以叫做「邊緣服務器」)。

那么將數(shù)據(jù)分發(fā)到這些遍布各地服務器上作為緩存,讓用戶訪問就近的服務器上的緩存數(shù)據(jù),就可以起到壓力分攤和加速效果。這在ToC類型的系統(tǒng)上運用,效果格外顯著。

但是需要注意的是,由于節(jié)點眾多,更新緩存數(shù)據(jù)比較緩慢,一般至少是分鐘級別。所以一般僅適用于不經(jīng)常變動的靜態(tài)數(shù)據(jù)。

題外話:解決方式也是有的,就是在url后面帶個自增數(shù)或者唯一標示,如?v=1001。因為不同的url會被視作“新”的數(shù)據(jù)和文件,被重新create出來。


網(wǎng)關(代理)緩存

到這里做緩存就是在你自己的地盤了。很多時候我們會在源站前面架一層網(wǎng)關(或者說反向代理、正向代理),為的是做一些安全機制或者統(tǒng)一分流策略的入口。

同時這里也是做緩存的一個好場所。畢竟網(wǎng)關是“業(yè)務無關性”的,它能夠攔下來的請求,對背后的源站也是很大的受益,減少了大量的CPU運算。

常用的網(wǎng)關(代理)緩存有Varnish,Squid,Ngnix。一般情況下,簡單的緩存運用場景,用nginx即可,因為大部分時候我們會用它來做負載均衡,能少引入一個技術就少一份復雜度嘛。如果是大量的小文件可以使用Varnish,而Squid則相對大而全,運用成本也更高一些。


進程內(nèi)緩存

一個請求能走到這里說明他是“業(yè)務相關”的,需要經(jīng)過業(yè)務邏輯的運算。

也正因為如此,從這里開始對緩存的引入成本比前面3種大大增加,因為對緩存與數(shù)據(jù)庫之間的「數(shù)據(jù)一致性」要求更高了。


可能我們大多數(shù)程序員第一次刻意使用緩存的場景就是這個時候。進程內(nèi)和進程外的緩存運用中有很多的細節(jié)需要注意,這些也是我們后續(xù)文章的內(nèi)容,所以我們后續(xù)再詳聊。


進程外緩存

這個大家也熟悉,就是redis、memcached之類,甚至也可以自己多帶帶寫一個程序來專門存放緩存數(shù)據(jù),供其他程序遠程調(diào)用。

同樣,這里的細節(jié)我們后續(xù)再聊,這里先多說幾句關于redis和memcached該怎么選擇的建議。

對資源(cpu、內(nèi)存等)利用率格外重視的話可以使用Memcached,但程序在使用的時候需要容忍可能發(fā)生的數(shù)據(jù)丟失,因為是純內(nèi)存的機制。如果無法容忍這點,并且對資源利用率也比較豪放的話可以使用redis。而且redis的數(shù)據(jù)庫結構更多,Memcached只有key value,更像是一個nosql存儲。


數(shù)據(jù)庫緩存

數(shù)據(jù)庫本身自帶緩存模塊的,否則也不會叫它內(nèi)存殺手,基本上你給多少內(nèi)存就能吃多少。

數(shù)據(jù)庫緩存是數(shù)據(jù)庫的內(nèi)部機制,我們這里就不深入下去了。一般都會給出設置緩存空間大小的配置來讓你進行干預。


最后,其實磁盤本身也有緩存。所以你會發(fā)現(xiàn),為了讓數(shù)據(jù)能夠平穩(wěn)的寫到物理磁盤中真的是一波三折,不知道什么時候可以有“快”到不需要程序來考慮緩存的磁盤出現(xiàn)來拯救我們程序員呢。


「緩存」是Silver bullet嗎?

可能你會想緩存那么好,那么應該多多益善,只要慢就上緩存來解決?

一個事物看上去再好,也有它負面的一面。緩存也有一系列的副作用需要考慮。除了上面提到的「緩存更新」和「緩存與數(shù)據(jù)的一致性」問題,還有諸如:

緩存雪崩

緩存穿透

緩存并發(fā)

緩存無底洞

緩存淘汰

...

等等問題,這些Z哥會在接下去的文章中和你一起深入剖析。

想第一時間了解這些的可以「關注」Z哥一波~

總結

好了,我們總結一下。

這次呢,Z哥先向你介紹了運用緩存的三種思路。

然后梳理了在一個完整的系統(tǒng)中可以設立緩存的幾個位置,并且分享了關于瀏覽器緩存、CDN緩存、網(wǎng)關(代理)緩存的一些使用經(jīng)驗。

希望對你有所啟發(fā)。


后續(xù)的文章我將著重深入「進程內(nèi)緩存」和「進程外緩存」的最佳實踐,等我再次出現(xiàn)。



相關文章:

分布式系統(tǒng)關注點——僅需這一篇,吃透「負載均衡」妥妥的

分布式系統(tǒng)關注點——如何去實施「負載均衡」?

分布式系統(tǒng)關注點——做了「負載均衡」就可以隨便加機器了嗎?

分布式系統(tǒng)關注點——「無狀態(tài)」詳解

分布式系統(tǒng)關注點——「高內(nèi)聚低耦合」詳解

分布式系統(tǒng)關注點——彈性架構


作者:Zachary

出處:https://www.cnblogs.com/Zacha...


如果你喜歡這篇文章,可以點一下文末的「」。

這樣可以給我一點反饋。: )

謝謝你的舉手之勞。


?關于作者:張帆(Zachary,個人微信號:Zachary-ZF)。堅持用心打磨每一篇高質量原創(chuàng)。歡迎掃描下方的二維碼~。
定期發(fā)表原創(chuàng)內(nèi)容:架構設計丨分布式系統(tǒng)丨產(chǎn)品丨運營丨一些思考。

如果你是初級程序員,想提升但不知道如何下手。又或者做程序員多年,陷入了一些瓶頸想拓寬一下視野。歡迎關注我的公眾號「跨界架構師」,回復「技術」,送你一份我長期收集和整理的思維導圖。

如果你是運營,面對不斷變化的市場束手無策。又或者想了解主流的運營策略,以豐富自己的“倉庫”。歡迎關注我的公眾號「跨界架構師」,回復「運營」,送你一份我長期收集和整理的思維導圖。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/62069.html

相關文章

  • 布式系統(tǒng)注點——先寫DB還是「緩存」?

    摘要:首當其沖的就是先寫還是緩存。先寫還是緩存一個程序可以沒有緩存,但是一定要有數(shù)據(jù)庫。為了便于記憶,你可以和分布式系統(tǒng)的定理同時記憶,叫緩存的模式。否則引入分布式緩存的作用就小了很多。就是設置緩存定時過期或者定時往下游的分布式緩存拉取最新數(shù)據(jù)。 如果第二次看到我的文章,歡迎文末掃碼訂閱我個人的公眾號(跨界架構師)喲~ 本文長度為4209字,建議閱讀12分鐘。堅持原創(chuàng),每一篇都是用心之作...

    ccj659 評論0 收藏0
  • 布式系統(tǒng)注點(18)——「緩存穿透」和「緩存雪崩」到底啥區(qū)別?

    摘要:不過,布隆過濾器有一個最大的缺點,也是其為了高效利用內(nèi)存而付出的代價,就是無法確保的準確率。不過這種方式的優(yōu)勢是前面提到的,不會出現(xiàn)誤差,而布隆過濾器的錯誤率會隨著位數(shù)的增加而減少,會不斷趨近于,但不會為。 ?如果第二次看到我的文章,歡迎文末掃碼訂閱我個人的公眾號(跨界架構師)喲~ 本文長度為2805字,建議閱讀8分鐘。堅持原創(chuàng),每一篇都是用心之作~ 有句話說得好,欲要使其毀滅,先要...

    tinyq 評論0 收藏0
  • 布式系統(tǒng)注點(19)——深入淺出「異步」

    摘要:如果你對異步的了解比較模糊的話,這次可以帶你一次性深入淺出。同步異步任何事物都是有利有弊的。這也導致了在異步環(huán)境下做事務的成本更高。但是,異步在跨進程通訊中更合適抽象成事件來進行協(xié)作。 如果第二次看到我的文章,歡迎「文末」掃碼訂閱我個人的公眾號(跨界架構師)喲~?每周五早8點 按時送達到公眾號。當然了,也會時不時加個餐~ Z哥在前面的三篇文章里和你一起聊了「高性能」主題下與「緩存」...

    BicycleWarrior 評論0 收藏0
  • GIAC 2017全球互聯(lián)網(wǎng)架構大會最新日程

    摘要:月日至日,高可用架構和聯(lián)合主辦的全球互聯(lián)網(wǎng)架構大會將于上海光大會展中心舉行。全球互聯(lián)網(wǎng)架構大會是高可用架構技術社區(qū)推廣的面向架構師技術負責人及高端技術從業(yè)人員的技術架構大會。本次大會共有大板塊方向,場技術專題,個互聯(lián)網(wǎng)架構案例。 showImg(https://segmentfault.com/img/bVZ3Vh?w=600&h=375);12月22日至23日,高可用架構和msup聯(lián)...

    617035918 評論0 收藏0
  • GIAC 2017全球互聯(lián)網(wǎng)架構大會最新日程

    摘要:月日至日,高可用架構和聯(lián)合主辦的全球互聯(lián)網(wǎng)架構大會將于上海光大會展中心舉行。全球互聯(lián)網(wǎng)架構大會是高可用架構技術社區(qū)推廣的面向架構師技術負責人及高端技術從業(yè)人員的技術架構大會。本次大會共有大板塊方向,場技術專題,個互聯(lián)網(wǎng)架構案例。 showImg(https://segmentfault.com/img/bVZ3Vh?w=600&h=375);12月22日至23日,高可用架構和msup聯(lián)...

    Imfan 評論0 收藏0

發(fā)表評論

0條評論

alanoddsoff

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<