成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

緩存穿透、雪崩、熱點(diǎn)與Redis

oujie / 3584人閱讀

摘要:關(guān)于緩存熱點(diǎn)重建原文說(shuō)到在緩存失效的瞬間,有大量線程來(lái)重建緩存,造成后端負(fù)載加大,甚至可能會(huì)讓?xiě)?yīng)用崩潰,并給出互斥鎖和永遠(yuǎn)不過(guò)期兩種候選方案。即使繞過(guò)互斥鎖,也不會(huì)產(chǎn)生什么不好的后果,因?yàn)楦戮彺媸且粋€(gè)冪等操作。

向大家推薦這篇文章——Redis架構(gòu)之防雪崩設(shè)計(jì):網(wǎng)站不宕機(jī)背后的兵法

(另外推薦我去年的短文作為餐前點(diǎn)心——略談服務(wù)端緩存設(shè)計(jì))

《Redis架構(gòu)之防雪崩設(shè)計(jì)》這篇文章(下文稱之為“原文”)寫(xiě)得非常好,全面概括了大規(guī)模系統(tǒng)可能面對(duì)的緩存穿透和緩存雪崩等問(wèn)題,可以看出是一線實(shí)戰(zhàn)經(jīng)驗(yàn)的精華總結(jié),非常適合大家學(xué)習(xí)。

而我想再補(bǔ)充一些信息,使“原文”的版圖更加完整。

關(guān)于“緩存穿透”

“原文”給出了空對(duì)象和布隆過(guò)濾器兩種解決方案。

空對(duì)象是首選方案,簡(jiǎn)單直接,碰到查詢結(jié)果為空的鍵,放一個(gè)空值在緩存中,下次再訪問(wèn)就立刻知道這個(gè)鍵無(wú)效,不用發(fā)出SQL了。但“原文”也說(shuō)了,存在如下問(wèn)題:

第一,空值做了緩存,意味著緩存層中存了更多的鍵,需要更多的內(nèi)存空間 ( 如果是攻擊,問(wèn)題更嚴(yán)重 ),比較有效的方法是針對(duì)這類數(shù)據(jù)設(shè)置一個(gè)較短的過(guò)期時(shí)間,讓其自動(dòng)剔除。

第二,緩存層和存儲(chǔ)層的數(shù)據(jù)會(huì)有一段時(shí)間窗口的不一致,可能會(huì)對(duì)業(yè)務(wù)有一定影響。例如過(guò)期時(shí)間設(shè)置為 5 分鐘,如果此時(shí)存儲(chǔ)層添加了這個(gè)數(shù)據(jù),那此段時(shí)間就會(huì)出現(xiàn)緩存層和存儲(chǔ)層數(shù)據(jù)的不一致,此時(shí)可以利用消息系統(tǒng)或者其他方式清除掉緩存層中的空對(duì)象。

對(duì)于第一點(diǎn),我還建議空值放在另外的緩存空間中,不宜與正常值共用空間,否則當(dāng)空間不足時(shí),緩存系統(tǒng)的LRU算法可能會(huì)先剔除正常值,再剔除空值——這個(gè)漏洞可能會(huì)受到攻擊。

對(duì)于第二點(diǎn),如果是Redis緩存,更新數(shù)據(jù)后直接在Redis中清除即可;如果是本地緩存,就需要用消息來(lái)通知其他機(jī)器清除各自的本地緩存了。(業(yè)界終于接受了用消息來(lái)同步緩存的設(shè)計(jì)思想,cheers! )我有一個(gè)小項(xiàng)目joint-cache-redis來(lái)簡(jiǎn)單地演示“用消息來(lái)同步多個(gè)機(jī)器的緩存”,而且在實(shí)踐中發(fā)現(xiàn)Kafka可能比Redis MQ更適合于這個(gè)場(chǎng)景。

關(guān)于“緩存雪崩”

這句概括很傳神!緩存層宕掉后,流量會(huì)像奔逃的野牛一樣,打向后端存儲(chǔ)

沒(méi)什么要補(bǔ)充的,就感謝一下Netflix開(kāi)源的Hystrix吧!雖然只是一個(gè)庫(kù),但是要實(shí)現(xiàn)可靠的限流算法還是頗有門(mén)道的。

關(guān)于“緩存熱點(diǎn) key 重建”

“原文”說(shuō)到在緩存失效的瞬間,有大量線程來(lái)重建緩存,造成后端負(fù)載加大,甚至可能會(huì)讓?xiě)?yīng)用崩潰,并給出“互斥鎖”和“永遠(yuǎn)不過(guò)期”兩種候選方案。

互斥鎖(Mutex):

“分布式緩存加鎖”通常是一個(gè)反模式(見(jiàn)我去年的文章大型服務(wù)端開(kāi)發(fā)的反模式第7條),如果持有鎖的實(shí)例不穩(wěn)定導(dǎo)致沒(méi)及時(shí)釋放,就會(huì)浪費(fèi)這個(gè)鎖,直到鎖過(guò)期?!霸摹钡淖髡哌€指出有死鎖的風(fēng)險(xiǎn)。

其實(shí)是可以優(yōu)化的:等待一兩次后,重試時(shí)可繞過(guò)互斥鎖。即使繞過(guò)互斥鎖,也不會(huì)產(chǎn)生什么不好的后果,因?yàn)楦戮彺媸且粋€(gè)冪等操作。

也可以把鎖的過(guò)期時(shí)間設(shè)得更短。

從這個(gè)例子我們能感覺(jué)到,冪等操作比非冪等操作更容易優(yōu)化。

永遠(yuǎn)不過(guò)期:

"原文"很好地介紹了在Redis中的做法。對(duì)于Guava本地緩存就簡(jiǎn)單多了,使用refreshAfterWrite即可。

“原文”讀到最后,才知道這是《Redis開(kāi)發(fā)與運(yùn)維》一書(shū)的節(jié)選,相信這本書(shū)會(huì)是國(guó)產(chǎn)技術(shù)書(shū)籍的精品!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/61856.html

相關(guān)文章

  • 三大緩存問(wèn)題及解決方案

    摘要:在某些查詢中,可以將所有可能的查詢條件放入這個(gè)集合,在查詢之前使用這個(gè)集合對(duì)查詢條件進(jìn)行過(guò)濾,就可以避免緩存穿透的問(wèn)題。解決方案二級(jí)緩存對(duì)于那些熱度高的數(shù)據(jù)設(shè)置二級(jí)緩存,并且錯(cuò)開(kāi)和一級(jí)緩存的失效時(shí)間,使請(qǐng)求不會(huì)同時(shí)穿透兩層緩存去訪問(wèn)數(shù)據(jù)庫(kù) 在我們的實(shí)際開(kāi)發(fā)應(yīng)用中,緩存機(jī)制的廣泛存在,大大的提高了系統(tǒng)對(duì)數(shù)據(jù)庫(kù)的請(qǐng)求承受閾值,但是在一些特定的場(chǎng)景下,需要去了解它可能出現(xiàn)的問(wèn)題和對(duì)應(yīng)的解決方...

    Simon 評(píng)論0 收藏0
  • 緩存雪崩緩存穿透、緩存更新了解多少?

    摘要:緩存穿透是指查詢一個(gè)一定不存在的數(shù)據(jù)。這就是緩存穿透請(qǐng)求的數(shù)據(jù)在緩存大量不命中,導(dǎo)致請(qǐng)求走數(shù)據(jù)庫(kù)。并發(fā)下解決數(shù)據(jù)庫(kù)與緩存不一致的思路將刪除緩存修改數(shù)據(jù)庫(kù)讀取緩存等的操作積壓到隊(duì)列里邊,實(shí)現(xiàn)串行化。 前言 只有光頭才能變強(qiáng)。 文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:https://github.com/ZhongFuCheng3y/3y 回顧前面: 從零單排學(xué)Redis【青銅...

    CNZPH 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<