日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

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

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

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

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

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

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

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

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

緩存空值

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

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

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

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

使用布隆過濾器

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

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

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

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

緩存穿透了怎么辦?

 

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

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

分享到:
標(biāo)簽:緩存 穿透
用戶無頭像

網(wǎng)友整理

注冊時間:

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

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

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

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

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

答題星2018-06-03

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

全階人生考試2018-06-03

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

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

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

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

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

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定