亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

 

緩存簡(jiǎn)介

隨著互聯(lián)網(wǎng)的普及,內(nèi)容信息越來(lái)越復(fù)雜,用戶數(shù)和訪問(wèn)量越來(lái)越大,我們的應(yīng)用需要支撐更多的并發(fā)量,同時(shí)我們的應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器所做的計(jì)算也越來(lái)越多。但是往往我們的應(yīng)用服務(wù)器資源是有限的,且技術(shù)變革是緩慢的,數(shù)據(jù)庫(kù)每秒能接受的請(qǐng)求次數(shù)也是有限的(或者文件的讀寫也是有限的),如何能夠有效利用有限的資源來(lái)提供盡可能大的吞吐量? 一個(gè)有效的辦法就是引入緩存,打破標(biāo)準(zhǔn)流程,每個(gè)環(huán)節(jié)中請(qǐng)求可以從緩存中直接獲取目標(biāo)數(shù)據(jù)并返回,從而減少計(jì)算量,有效提升響應(yīng)速度,讓有限的資源服務(wù)更多的用戶。

關(guān)鍵詞-命中率

命中率 = 命中數(shù) / (命中數(shù) + 沒(méi)有命中數(shù))

影響緩存命中率的因素:

1、業(yè)務(wù)場(chǎng)景和業(yè)務(wù)需求

緩存通常適合讀多寫少的業(yè)務(wù)場(chǎng)景,反之的使用意義并不多,命中率會(huì)很低。業(yè)務(wù)需求也決定了實(shí)時(shí)性的要求,直接影響到過(guò)期時(shí)間和更新策略,實(shí)時(shí)性要求越低越適合緩存。

2、緩存的設(shè)計(jì)(策略和粒度)

通常情況下緩存的粒度越小,命中率越高。比如說(shuō)緩存一個(gè)用戶信息的對(duì)象,只有當(dāng)這個(gè)用戶的信息發(fā)生變化的時(shí)候才更新緩存,而如果是緩存一個(gè)集合的話,集合中任何一個(gè)對(duì)象發(fā)生變化都要重新更新緩存。

當(dāng)數(shù)據(jù)發(fā)生變化時(shí),直接更新緩存的值比移除緩存或者讓緩存過(guò)期它的命中率更高,不過(guò)這個(gè)時(shí)候系統(tǒng)的復(fù)雜度過(guò)高。

3、緩存的容量和基礎(chǔ)設(shè)施

緩存的容量有限就會(huì)容易引起緩存的失效和被淘汰。目前多數(shù)的緩存框架和中間件都采用LRU這個(gè)算法。同時(shí)采用緩存的技術(shù)選型也是至關(guān)重要的,比如采用本地內(nèi)置的應(yīng)用緩存,就比較容易出現(xiàn)單機(jī)瓶頸。而采用分布式緩存就更加容易擴(kuò)展。所以需要做好系統(tǒng)容量規(guī)劃,系統(tǒng)是否可擴(kuò)展。

最大空間

緩存最大空間一旦緩存中元素?cái)?shù)量超過(guò)這個(gè)值(或者緩存數(shù)據(jù)所占空間超過(guò)其最大支持空間),那么將會(huì)觸發(fā)緩存啟動(dòng)清空策略根據(jù)不同的場(chǎng)景合理的設(shè)置最大元素值往往可以一定程度上提高緩存的命中率,從而更有效的利用緩存。

緩存介質(zhì)

雖然從硬件介質(zhì)上來(lái)看,無(wú)非就是內(nèi)存和硬盤兩種,但從技術(shù)上,可以分成內(nèi)存、硬盤文件、數(shù)據(jù)庫(kù)。

1、內(nèi)存:將緩存存儲(chǔ)于內(nèi)存中是最快的選擇,無(wú)需額外的I/O開(kāi)銷,但是內(nèi)存的缺點(diǎn)是沒(méi)有持久化落地物理磁盤,一旦應(yīng)用異常break down而重新啟動(dòng),數(shù)據(jù)很難或者無(wú)法復(fù)原。

2、硬盤:一般來(lái)說(shuō),很多緩存框架會(huì)結(jié)合使用內(nèi)存和硬盤,在內(nèi)存分配空間滿了或是在異常的情況下,可以被動(dòng)或主動(dòng)的將內(nèi)存空間數(shù)據(jù)持久化到硬盤中,達(dá)到釋放空間或備份數(shù)據(jù)的目的。

3、數(shù)據(jù)庫(kù):前面有提到,增加緩存的策略的目的之一就是為了減少數(shù)據(jù)庫(kù)的I/O壓力。現(xiàn)在使用數(shù)據(jù)庫(kù)做緩存介質(zhì)是不是又回到了老問(wèn)題上了? 其實(shí),數(shù)據(jù)庫(kù)也有很多種類型,像那些不支持SQL,只是簡(jiǎn)單的key-value存儲(chǔ)結(jié)構(gòu)的特殊數(shù)據(jù)庫(kù)(如BerkeleyDB和redis),響應(yīng)速度和吞吐量都遠(yuǎn)遠(yuǎn)高于我們常用的關(guān)系型數(shù)據(jù)庫(kù)等。

緩存淘汰算法

FIFO/LFU/LRU/過(guò)期時(shí)間/隨機(jī)

1、FIFO:最先進(jìn)入緩存的數(shù)據(jù),在緩存空間不足時(shí)被清除,為了保證最新數(shù)據(jù)可用,保證實(shí)時(shí)性

2、LFU(Least Frequently Used):最近最不常用,基于訪問(wèn)次數(shù),去除命中次數(shù)最少的元素,保證高頻數(shù)據(jù)有效性

3、LRU(Least Recently Used):最近最少使用,基于訪問(wèn)時(shí)間,在被訪問(wèn)過(guò)的元素中去除最久未使用的元素,保證熱點(diǎn)數(shù)據(jù)的有效性

緩存一致性問(wèn)題

當(dāng)數(shù)據(jù)時(shí)效性要求很高時(shí),需要保證緩存中的數(shù)據(jù)與數(shù)據(jù)庫(kù)中的保持一致,而且需要保證緩存節(jié)點(diǎn)和副本中的數(shù)據(jù)也保持一致,不能出現(xiàn)差異現(xiàn)象。這就比較依賴緩存的過(guò)期和更新策略。一般會(huì)在數(shù)據(jù)發(fā)生更改的時(shí),主動(dòng)更新緩存中的數(shù)據(jù)或者移除對(duì)應(yīng)的緩存。

緩存并發(fā)問(wèn)題

緩存過(guò)期后將嘗試從后端數(shù)據(jù)庫(kù)獲取數(shù)據(jù),這是一個(gè)看似合理的流程。但是,在高并發(fā)場(chǎng)景下,有可能多個(gè)請(qǐng)求并發(fā)的去從數(shù)據(jù)庫(kù)獲取數(shù)據(jù),對(duì)后端數(shù)據(jù)庫(kù)造成極大的沖擊,甚至導(dǎo)致 “雪崩”現(xiàn)象。此外,當(dāng)某個(gè)緩存key在被更新時(shí),同時(shí)也可能被大量請(qǐng)求在獲取,這也會(huì)導(dǎo)致一致性的問(wèn)題。那如何避免類似問(wèn)題呢? 我們會(huì)想到類似“鎖”的機(jī)制,在緩存更新或者過(guò)期的情況下,先嘗試獲取到鎖,當(dāng)更新或者從數(shù)據(jù)庫(kù)獲取完成后再釋放鎖,其他的請(qǐng)求只需要犧牲一定的等待時(shí)間,即可直接從緩存中繼續(xù)獲取數(shù)據(jù)。

緩存穿透問(wèn)題

緩存穿透在有些地方也稱為“擊穿”。很多朋友對(duì)緩存穿透的理解是:由于緩存故障或者緩存過(guò)期導(dǎo)致大量請(qǐng)求穿透到后端數(shù)據(jù)庫(kù)服務(wù)器,從而對(duì)數(shù)據(jù)庫(kù)造成巨大沖擊。

這其實(shí)是一種誤解。真正的緩存穿透應(yīng)該是這樣的:

在高并發(fā)場(chǎng)景下,如果某一個(gè)key被高并發(fā)訪問(wèn),沒(méi)有被命中,出于對(duì)容錯(cuò)性考慮,會(huì)嘗試去從后端數(shù)據(jù)庫(kù)中獲取,從而導(dǎo)致了大量請(qǐng)求達(dá)到數(shù)據(jù)庫(kù),而當(dāng)該key對(duì)應(yīng)的數(shù)據(jù)本身就是空的情況下,這就導(dǎo)致數(shù)據(jù)庫(kù)中并發(fā)的去執(zhí)行了很多不必要的查詢操作,從而導(dǎo)致巨大沖擊和壓力。

可以通過(guò)下面的幾種常用方式來(lái)避免緩存?zhèn)鹘y(tǒng)問(wèn)題:

1、緩存空對(duì)象

對(duì)查詢結(jié)果為空的對(duì)象也進(jìn)行緩存,如果是集合,可以緩存一個(gè)空的集合(非null),如果是緩存單個(gè)對(duì)象,可以通過(guò)字段標(biāo)識(shí)來(lái)區(qū)分。這樣避免請(qǐng)求穿透到后端數(shù)據(jù)庫(kù)。同時(shí),也需要保證緩存數(shù)據(jù)的時(shí)效性。這種方式實(shí)現(xiàn)起來(lái)成本較低,比較適合命中不高,但可能被頻繁更新的數(shù)據(jù)。

2、單獨(dú)過(guò)濾處理

對(duì)所有可能對(duì)應(yīng)數(shù)據(jù)為空的key進(jìn)行統(tǒng)一的存放,并在請(qǐng)求前做攔截,這樣避免請(qǐng)求穿透到后端數(shù)據(jù)庫(kù)。這種方式實(shí)現(xiàn)起來(lái)相對(duì)復(fù)雜,比較適合命中不高,但是更新不頻繁的數(shù)據(jù)。

緩存雪崩問(wèn)題

緩存雪崩就是指由于緩存的原因,導(dǎo)致大量請(qǐng)求到達(dá)后端數(shù)據(jù)庫(kù),從而導(dǎo)致數(shù)據(jù)庫(kù)崩潰,整個(gè)系統(tǒng)崩潰,發(fā)生災(zāi)難。導(dǎo)致這種現(xiàn)象的原因有很多種,上面提到的“緩存并發(fā)”,“緩存穿透”,“緩存顛簸”等問(wèn)題,其實(shí)都可能會(huì)導(dǎo)致緩存雪崩現(xiàn)象發(fā)生。這些問(wèn)題也可能會(huì)被惡意攻擊者所利用。還有一種情況,例如某個(gè)時(shí)間點(diǎn)內(nèi),系統(tǒng)預(yù)加載的緩存周期性集中失效了,也可能會(huì)導(dǎo)致雪崩。為了避免這種周期性失效,可以通過(guò)設(shè)置不同的過(guò)期時(shí)間,來(lái)錯(cuò)開(kāi)緩存過(guò)期,從而避免緩存集中失效。

從應(yīng)用架構(gòu)角度,我們可以通過(guò)限流、降級(jí)、熔斷等手段來(lái)降低影響,也可以通過(guò)多級(jí)緩存來(lái)避免這種災(zāi)難。

此外,從整個(gè)研發(fā)體系流程的角度,應(yīng)該加強(qiáng)壓力測(cè)試,盡量模擬真實(shí)場(chǎng)景,盡早的暴露問(wèn)題從而防范。

如若轉(zhuǎn)載,請(qǐng)注明出處:開(kāi)源字節(jié) https://sourcebyte.cn/article/231.html

分享到:
標(biāo)簽:并發(fā)
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定