關(guān)于軟件設(shè)計(jì)中緩存的那些事兒
?緩存可以說(shuō)是最簡(jiǎn)單也最復(fù)雜的一個(gè)概念,用好它你可以讓你的應(yīng)用飛起,不會(huì)用它,即使再高的配置,你的應(yīng)用也難以發(fā)揮最佳效果。
什么是緩存
緩存就是硬件或者軟件直接存取數(shù)據(jù),而不是從原始源(數(shù)據(jù)庫(kù),計(jì)算等)存取數(shù)據(jù),它會(huì)加快數(shù)據(jù)的讀取。
內(nèi)存緩存是我們經(jīng)常使用的緩存技術(shù),通過(guò)將常用的數(shù)據(jù)保存到內(nèi)存中,我們就可以避免從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù),這會(huì)大大提升應(yīng)用的加載速度,提升用戶體驗(yàn)。
什么時(shí)候使用緩存
- 當(dāng)我們需要請(qǐng)求外部資源的時(shí)候,比如第三方 api,我們希望緩存請(qǐng)求的結(jié)果
- 當(dāng)請(qǐng)求的數(shù)據(jù)發(fā)生變化的時(shí)候,我們可以緩存返回結(jié)果
- 當(dāng)應(yīng)用需要頻繁地請(qǐng)求同一個(gè)資源的時(shí)候
- 當(dāng)應(yīng)用需要運(yùn)行一些復(fù)雜的計(jì)算機(jī)的時(shí)候
- 當(dāng)應(yīng)用查詢耗時(shí)的時(shí)候
緩存的好處
- 提升應(yīng)用的性能
- 減少數(shù)據(jù)庫(kù)的開銷
- 增加并發(fā)
緩存的類型
- 應(yīng)用緩存
- 數(shù)據(jù)庫(kù)緩存
- DNS 緩存
- 客戶端緩存
- CDN 緩存
- API 網(wǎng)關(guān)緩存
分布式緩存
分布式緩存由一個(gè)服務(wù)端實(shí)現(xiàn)管理和控制,有多個(gè)客戶端節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù),可以進(jìn)一步提高數(shù)據(jù)的讀取速率。那么我們要讀取某個(gè)數(shù)據(jù)的時(shí)候,應(yīng)該選擇哪個(gè)節(jié)點(diǎn)呢?如果挨個(gè)節(jié)點(diǎn)找,那效率就太低了。因此需要根據(jù)一致性哈希算法確定數(shù)據(jù)的存儲(chǔ)和讀取節(jié)點(diǎn)。以數(shù)據(jù) D,節(jié)點(diǎn)總個(gè)數(shù) N 為基礎(chǔ),通過(guò)一致性哈希算法計(jì)算出數(shù)據(jù) D 對(duì)應(yīng)的哈希值(相當(dāng)于門牌號(hào)),根據(jù)這個(gè)哈希值就可以找到對(duì)應(yīng)的節(jié)點(diǎn)了。一致哈希算法的好處在于節(jié)點(diǎn)個(gè)數(shù)發(fā)生變化(減少或增加)時(shí)無(wú)需重新計(jì)算哈希值,保證數(shù)據(jù)儲(chǔ)存或讀取時(shí)可以正確、快速地找到對(duì)應(yīng)的節(jié)點(diǎn)。
分布式緩存能夠高性能地讀取數(shù)據(jù)、能夠動(dòng)態(tài)地?cái)U(kuò)展緩存節(jié)點(diǎn)、能夠自動(dòng)發(fā)現(xiàn)和切換故障節(jié)點(diǎn)、能夠自動(dòng)均衡數(shù)據(jù)分區(qū),而且能夠?yàn)槭褂谜咛峁﹫D形化的管理界面,部署和維護(hù)都十分方便。
緩存策略
(1) Cache-Aside
先讀取緩存,如果緩存失效,那么讀取數(shù)據(jù)庫(kù)獲取數(shù)據(jù),然后將數(shù)據(jù)設(shè)置到緩存里面。
(2) Read Through
應(yīng)用只從緩存取數(shù)據(jù),如果沒有取到,那么緩存會(huì)從數(shù)據(jù)庫(kù)獲取數(shù)據(jù),然后設(shè)置緩存,最后應(yīng)用從緩存繼續(xù)讀取數(shù)據(jù)。
(3) Write Through
應(yīng)用保存數(shù)據(jù)的時(shí)候,都是先保存到緩存里面,緩存會(huì)將數(shù)據(jù)再保存到數(shù)據(jù)庫(kù),應(yīng)用不直接和數(shù)據(jù)庫(kù)打交道,只是保存數(shù)據(jù)到緩存。
(44) Write Back or Write Behind
應(yīng)用程序?qū)?shù)據(jù)寫入緩存,然后會(huì)發(fā)送確認(rèn)返回給應(yīng)用,然后緩存寫入數(shù)據(jù)庫(kù)。
(5) Write Around
應(yīng)用數(shù)據(jù)直接寫入數(shù)據(jù)庫(kù),從而讀取數(shù)據(jù)從緩存中獲取。
總結(jié)
曾經(jīng)有個(gè)偉人說(shuō)過(guò),所有我們目前解決不了的計(jì)算機(jī)問(wèn)題,都可以通過(guò)添加一個(gè)中間層來(lái)解決,而緩存就是一個(gè)中間層,有了這個(gè)中間層,我們的應(yīng)用性能得到了極大提升,但緩存不是萬(wàn)能的,它也有它的弊端,只有合理的使用它,我們才能發(fā)揮它的最大價(jià)值。