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

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

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

在現(xiàn)在互聯(lián)網(wǎng)架構(gòu)中,幾乎每個(gè)互聯(lián)網(wǎng)項(xiàng)目都會(huì)引入緩存系統(tǒng),比如 redis、Memcached。來(lái)保護(hù)下游數(shù)據(jù)庫(kù)和提升系統(tǒng)并發(fā)量。不管使用哪種緩存系統(tǒng)都有可能遇到 緩存穿透 的問(wèn)題。

緩存穿透是指在緩存系統(tǒng)中沒(méi)有查詢(xún)到數(shù)據(jù),而不得不將請(qǐng)求打到數(shù)據(jù)庫(kù)上查詢(xún)的情況。

當(dāng)然緩存系統(tǒng)是不可避免的,少量的緩存穿透對(duì)系統(tǒng)也沒(méi)有損害,不可避免的原因有以下幾點(diǎn):

  • 緩存系統(tǒng)的容量是有限的,不可能存儲(chǔ)系統(tǒng)所有的數(shù)據(jù),那么在查詢(xún)未緩存數(shù)據(jù)的時(shí)候就會(huì)發(fā)生緩存穿透。
  • 另一方面就是基于‘二八原則’,我們通常只會(huì)緩存常用的那 20% 的熱點(diǎn)數(shù)據(jù)。

正常情況下的緩存穿透是沒(méi)什么傷害的,但是如果你的系統(tǒng)遭遇攻擊,存在大量的緩存穿透的話,那么可能就是一個(gè)麻煩了,如果大量的緩存穿透超過(guò)了后端服務(wù)器的承受能力,那么就有可能造成服務(wù)崩潰,這是不可接受的。

基于存在這種大量緩存穿透的可能性,所以我們就需要從根源上解決緩存穿透的問(wèn)題,解決緩存穿透,目前一般有兩種方案: 緩存空值和使用隆過(guò)濾器 。

緩存空值

如果我們系統(tǒng)是遇到攻擊的話,那么很有可能查詢(xún)的值是偽造的,必然大概率不存在我們的系統(tǒng)中,這樣無(wú)論查詢(xún)多少次,在緩存中一直不存在,這樣緩存穿透就一直存在。

在這種情況下,我們可以在緩存系統(tǒng)中緩存一個(gè)空值,防止穿透一直存在,但是因?yàn)榭罩挡⒉皇菧?zhǔn)確的業(yè)務(wù)數(shù)據(jù),并且會(huì)占用緩存的空間,所以我們會(huì)給這個(gè)空值加一個(gè)比較短的過(guò)期時(shí)間,讓空值在短時(shí)間之內(nèi)能夠快速過(guò)期淘汰。下面是一段偽代碼:

Object nullValue = new Object();
try {
  Object valueFromDB = getFromDB(uid); //從數(shù)據(jù)庫(kù)中查詢(xún)數(shù)據(jù)
  if (valueFromDB == null) {
    cache.set(uid, nullValue, 10);   //如果從數(shù)據(jù)庫(kù)中查詢(xún)到空值,就把空值寫(xiě)入緩存,設(shè)置較短的超時(shí)時(shí)間
  } else {
    cache.set(uid, valueFromDB, 1000);
  }
} catch(Exception e) {
  cache.set(uid, nullValue, 10);
}

雖然這種方法可以解決緩存穿透的問(wèn)題,但是這種方式也存在弊端, 因?yàn)樵诰彺嫦到y(tǒng)中存了大量的空值,浪費(fèi)緩存的存儲(chǔ)空間,如果緩存空間被占滿(mǎn)了,還會(huì)還會(huì)剔除掉一些已經(jīng)被緩存的用戶(hù)信息反而會(huì)造成緩存命中率的下降。

使用布隆過(guò)濾器

1970年布隆提出了一種布隆過(guò)濾器的算法,用來(lái)判斷一個(gè)元素是否在一個(gè)集合中。布隆過(guò)濾器底層是一個(gè)超級(jí)大的 bit 數(shù)組,默認(rèn)值都是 0 ,一個(gè)元素通過(guò)多個(gè)hash函數(shù)映射到這個(gè) bit 數(shù)組上,并且將 0 改成 1。當(dāng)然布隆過(guò)濾器也不需要我們實(shí)現(xiàn),在 google 的 guava 包中有提供布隆過(guò)濾器,有興趣的小伙伴可以研究研究。

布隆過(guò)濾器存在一定的誤判,因?yàn)椴捎胔ash算法,就一定會(huì)存在哈希沖突,這樣就可能造成不在數(shù)據(jù)庫(kù)中的元素被判斷在布隆過(guò)濾器中存在,但是 不在布隆過(guò)濾器中的元素一定不存在數(shù)據(jù)庫(kù)中。

利用布隆過(guò)濾器的這個(gè)特點(diǎn)可以解決緩存穿透的問(wèn)題, 在服務(wù)啟動(dòng)的時(shí)候先把數(shù)據(jù)的查詢(xún)條件,例如數(shù)據(jù)的 ID 映射到布隆過(guò)濾器上,當(dāng)然如果新增數(shù)據(jù)時(shí),除了寫(xiě)入到數(shù)據(jù)庫(kù)中之外,也需要將數(shù)據(jù)的ID存入到布隆過(guò)濾器中 。

我們?cè)诓樵?xún)某條數(shù)據(jù)時(shí),先判斷這個(gè)查詢(xún)的 ID 是否存在布隆過(guò)濾器中,如果不存在就直接返回空值,而不需要繼續(xù)查詢(xún)數(shù)據(jù)庫(kù)和緩存,存在布隆過(guò)濾器中才繼續(xù)查詢(xún)數(shù)據(jù)庫(kù)和緩存,這樣就解決緩存穿透的問(wèn)題。

緩存穿透了怎么辦?

 

當(dāng)然布隆過(guò)濾器有缺陷,除了上面我們講到過(guò)的存在一定的誤判,還有一個(gè)就是 不支持刪除

緩存空值和使用布隆過(guò)濾器都可以在一定程度上解決緩存穿透的問(wèn)題,各自有各自的優(yōu)勢(shì),具體如何使用根據(jù)特定的場(chǎng)景舍取。

分享到:
標(biāo)簽:緩存 穿透
用戶(hù)無(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)定