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

程序員都不知道的緩存秘密,看完,秒懂緩存

數(shù)據(jù)庫 其他數(shù)據(jù)庫
只要是干程序的都知道"緩存"是什么,甚至是跟IT相關(guān)行業(yè)各種人員都時(shí)不時(shí)冒出一句,系統(tǒng)慢可以加"緩存"呀,但緩存真的這么這么簡單,人人都會(huì)用嗎?

只要是干程序的都知道"緩存"是什么,甚至是跟IT相關(guān)行業(yè)各種人員都時(shí)不時(shí)冒出一句,系統(tǒng)慢可以加"緩存"呀,比如測試組的小姐姐,運(yùn)營組的小妹妹,產(chǎn)品組的小哥哥。但緩存真的這么這么簡單,人人都會(huì)用嗎?

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

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

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

文章從如下幾方面探討緩存:

1. 緩存能做什么?

2. 什么地方可以加緩存?

3. 緩存是Silver bullet嗎?

1、緩存能做什么?

正如前面所說,大家普遍的理解就是當(dāng)我們遇到某個(gè)頁面打開很慢的時(shí)候,會(huì)想到引入緩存,這樣頁面打開就快了。

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

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

 

其實(shí)除此之外,緩存還有另外2個(gè)重要的使用方式,預(yù)讀取 和 延遲寫。

預(yù)讀取

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

 

這樣做的原因是因?yàn)橛行┫到y(tǒng)一旦啟動(dòng)就要面臨上千上萬的請求進(jìn)來,如果直接讓這些請求打到數(shù)據(jù)庫上,非常大的可能是數(shù)據(jù)庫壓力暴增,直接被干趴,無法正常響應(yīng)。

為了緩解這個(gè)問題,需要通過 預(yù)讀取 來解決。

可能你會(huì)問,哪怕用了緩存還是扛不住呢?那就需要做橫向擴(kuò)展+負(fù)載均衡了。

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

延遲寫

大家都知道,數(shù)據(jù)庫的寫入速度是慢于讀取速度的,因?yàn)閷懭氲臅r(shí)候有一系列的保證數(shù)據(jù)準(zhǔn)確性的機(jī)制。

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

由于分庫分表對跨表操作以及多條件組合查詢的副作用巨大,所以引入它的復(fù)雜度遠(yuǎn)大于引入緩存,我們應(yīng)當(dāng)優(yōu)先考慮引入緩存的方案。

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

 

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

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

其實(shí)在我們熟知的分布式緩存Redis中,其默認(rèn)運(yùn)用的持久化機(jī)制——RDB,也是這樣的思路。

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

哪里可以加 緩存 ?

首先搞清楚一個(gè)事情,我們要緩存什么?也就是符合什么特點(diǎn)的數(shù)據(jù)才需要加緩存?畢竟加緩存是一個(gè)額外的成本投入,得物有所值。

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

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

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

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

 

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

 

下面小劃帽簡要描述下每一個(gè)的運(yùn)用場景以及需要注意的點(diǎn)。

瀏覽器緩存

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

 

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

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

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

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

CDN緩存

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

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

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

解決方式也是有的,就是在url后面帶個(gè)自增數(shù)或者唯一標(biāo)示,如?v=1000。因?yàn)椴煌膗rl會(huì)被視作"新"的數(shù)據(jù)和文件,被重新create出來。

網(wǎng)關(guān)(代理)緩存

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

 

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

常用的網(wǎng)關(guān)(代理)緩存有Varnish,Squid,Ngnix。一般情況下,簡單的緩存運(yùn)用場景,用nginx即可,因?yàn)榇蟛糠謺r(shí)候我們會(huì)用它來做負(fù)載均衡,能少引入一個(gè)技術(shù)就少一份復(fù)雜度嘛。如果是大量的小文件可以使用Varnish,而Squid則相對大而全,運(yùn)用成本也更高一些。

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

一個(gè)請求能走到這里說明他是"業(yè)務(wù)相關(guān)"的,需要經(jīng)過業(yè)務(wù)邏輯的運(yùn)算。

也正因?yàn)槿绱耍瑥倪@里開始對緩存的引入成本比前面3種大大增加,因?yàn)閷彺媾c數(shù)據(jù)庫之間的 數(shù)據(jù)一致性 要求更高了。

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

進(jìn)程外緩存

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

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

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

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

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

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

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

緩存是Silver bullet嗎?

可能你會(huì)想緩存那么好,那么應(yīng)該多多益善,只要慢就上緩存來解決?

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

1、緩存雪崩

2、緩存穿透

3、緩存并發(fā)

4、緩存無底洞

5、緩存淘汰

6、...

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

總結(jié)

好了,我們總結(jié)一下。這次呢,IT技術(shù)研習(xí)社向你介紹了運(yùn)用緩存的三種思路。

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

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

IT技術(shù)研習(xí)社,專注互聯(lián)網(wǎng)技術(shù)研究與分享,把經(jīng)驗(yàn)傳遞給有夢想的人。

 

責(zé)任編輯:龐桂玉 來源: 今日頭條
相關(guān)推薦

2020-12-21 09:00:04

MySQL緩存SQL

2020-12-21 09:44:53

MySQL查詢緩存數(shù)據(jù)庫

2022-07-04 07:09:55

架構(gòu)

2021-03-01 19:13:45

YAML程序員數(shù)據(jù)

2021-02-08 22:32:43

程序員 靜態(tài)網(wǎng)頁

2017-01-19 15:11:37

AndroidRetrofitRxCache

2010-08-23 09:56:09

Java性能監(jiān)控

2018-05-08 15:30:46

程序員代碼框架

2021-06-27 21:37:27

緩存雪崩穿透

2021-07-26 05:17:39

Linux PosixLinux 系統(tǒng)

2011-08-23 13:50:17

程序員

2022-08-08 11:13:35

API接口前端

2022-10-29 17:34:18

JVMJava

2018-09-20 17:05:01

前端程序員JavaScript

2021-02-23 07:10:54

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

2011-07-11 15:52:47

RCWindows

2013-11-21 13:35:19

程序員牛人

2020-07-29 09:53:09

VSCode編碼工具插件

2025-04-17 02:30:00

2011-05-29 17:04:10

筆記本體驗(yàn)
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 国产日本精品视频 | 日本一区二区高清不卡 | 五月激情综合 | 日韩影院在线 | 色爱综合网 | 久久com | 久久亚洲一区 | 国产精品无码永久免费888 | 亚洲a网 | 欧美极品在线观看 | 亚洲一区二区三区在线 | 久久久久久高潮国产精品视 | 精品免费视频 | 韩国毛片一区二区三区 | 日本三级做a全过程在线观看 | 日本天堂一区二区 | 亚洲国产成人精品女人 | 欧产日产国产精品v | 久久一区二区三区四区 | 国产精品久久久久无码av | www.青娱乐| 国产一级片网站 | 成人在线播放网站 | 一区二区三区回区在观看免费视频 | 久草免费在线视频 | 人成久久 | 日韩中文一区二区三区 | 淫片一级国产 | 国产真实精品久久二三区 | 欧美激情国产日韩精品一区18 | 天天在线操 | 欧美中文字幕一区二区 | 91精品国产乱码久久久久久久久 | 91高清视频在线观看 | 中文字幕在线第二页 | 久久精品一区 | 精品在线观看一区二区 | 久久久精品影院 | 免费在线观看91 | 久久99精品久久 | 成人精品国产 |