濮阳杆衣贸易有限公司

主頁 > 知識庫 > 詳解Redis緩存穿透/擊穿/雪崩原理及其解決方案

詳解Redis緩存穿透/擊穿/雪崩原理及其解決方案

熱門標(biāo)簽:山東外呼銷售系統(tǒng)招商 日本中國地圖標(biāo)注 貴州電銷卡外呼系統(tǒng) 超呼電話機(jī)器人 鄭州人工智能電銷機(jī)器人系統(tǒng) 北京400電話辦理收費(fèi)標(biāo)準(zhǔn) 十堰營銷電銷機(jī)器人哪家便宜 宿遷便宜外呼系統(tǒng)平臺 魔獸2青云地圖標(biāo)注

1. 簡介

如圖所示,一個(gè)正常的請求

1.客戶端請求張鐵牛的博客。

2.服務(wù)首先會請求redis,查看請求的內(nèi)容是否存在。

3.redis將請求結(jié)果返回給服務(wù),如果返回的結(jié)果有數(shù)據(jù)則執(zhí)行7;如果沒有數(shù)據(jù)則會繼續(xù)往下執(zhí)行。

4.服務(wù)從數(shù)據(jù)庫中查詢請求的數(shù)據(jù)。

5.數(shù)據(jù)庫將查詢的結(jié)果返回給服務(wù)。

6.如果數(shù)據(jù)庫有返回?cái)?shù)據(jù),則將返回的結(jié)果添加到redis。

7.將請求到的數(shù)據(jù)返回給客戶端。

2. 緩存穿透

2.1描述

通過接口訪問一個(gè)緩存和數(shù)據(jù)庫都不存在的數(shù)據(jù)。

因?yàn)榉?wù)出于容錯(cuò)考慮,當(dāng)請求從持久層查不到數(shù)據(jù)則不寫入緩存,這將導(dǎo)致請求這個(gè)不存在的數(shù)據(jù)每次都要到持久層去查詢,失去了緩存的意義。

此時(shí),緩存起不到保護(hù)后端持久層的意義,就像被穿透了一樣。導(dǎo)致數(shù)據(jù)庫存在被打掛的風(fēng)險(xiǎn)。

2.2 解決方案

1.接口請求參數(shù)的校驗(yàn)。對請求的接口進(jìn)行鑒權(quán),數(shù)據(jù)合法性的校驗(yàn)等;比如查詢的userId不能是負(fù)值或者包含非法字符等。

2.當(dāng)數(shù)據(jù)庫返回空值時(shí),將空值緩存到redis,并設(shè)置合理的過期時(shí)間。

3.布隆過濾器。使用布隆過濾器存儲所有可能訪問的 key,不存在的 key 直接被過濾,存在的 key 則再進(jìn)一步查詢緩存和數(shù)據(jù)庫。

3. 緩存擊穿

3.1 描述

某個(gè)熱點(diǎn) key,在緩存過期的一瞬間,同時(shí)有大量的請求打進(jìn)來,由于此時(shí)緩存過期了,所以請求最終都會走到數(shù)據(jù)庫,造成瞬時(shí)數(shù)據(jù)庫請求量大、壓力驟增,導(dǎo)致數(shù)據(jù)庫存在被打掛的風(fēng)險(xiǎn)。

3.2 解決方案

1.加互斥鎖。當(dāng)熱點(diǎn)key過期后,大量的請求涌入時(shí),只有第一個(gè)請求能獲取鎖并阻塞,此時(shí)該請求查詢數(shù)據(jù)庫,并將查詢結(jié)果寫入redis后釋放鎖。后續(xù)的請求直接走緩存。

2.設(shè)置緩存不過期或者后臺有線程一直給熱點(diǎn)數(shù)據(jù)續(xù)期。

4. 緩存雪崩

4.1 描述

大量的熱點(diǎn)數(shù)據(jù)過期時(shí)間相同,導(dǎo)致數(shù)據(jù)在同一時(shí)刻集體失效。造成瞬時(shí)數(shù)據(jù)庫請求量大、壓力驟增,引起雪崩,導(dǎo)致數(shù)據(jù)庫存在被打掛的風(fēng)險(xiǎn)。

4.1 解決方案

1.將熱點(diǎn)數(shù)據(jù)的過期時(shí)間打散。給熱點(diǎn)數(shù)據(jù)設(shè)置過期時(shí)間時(shí)加個(gè)隨機(jī)值。

2.加互斥鎖。當(dāng)熱點(diǎn)key過期后,大量的請求涌入時(shí),只有第一個(gè)請求能獲取鎖并阻塞,此時(shí)該請求查詢數(shù)據(jù)庫,并將查詢結(jié)果寫入redis后釋放鎖。后續(xù)的請求直接走緩存。

3.設(shè)置緩存不過期或者后臺有線程一直給熱點(diǎn)數(shù)據(jù)續(xù)期。

5. 布隆過濾器

5.1 描述

布隆過濾器是防止緩存穿透的方案之一。布隆過濾器主要是解決大規(guī)模數(shù)據(jù)下不需要精確過濾的業(yè)務(wù)場景,如檢查垃圾郵件地址,爬蟲URL地址去重, 解決緩存穿透問題等。

布隆過濾器:在一個(gè)存在一定數(shù)量的集合中過濾一個(gè)對應(yīng)的元素,判斷該元素是否一定不在集合中或者可能在集合中。它的優(yōu)點(diǎn)是空間效率和查詢時(shí)間都比一般的算法要好的多,缺點(diǎn)是有一定的誤識別率和刪除困難。

5.2 數(shù)據(jù)結(jié)構(gòu)

布隆過濾器是基于bitmap和若干個(gè)hash算法實(shí)現(xiàn)的。如下圖所示:

1.元素tie經(jīng)過hash1,hash2,hash3運(yùn)算出對應(yīng)的三個(gè)值落到了數(shù)組下標(biāo)為4,6,8的位置上,并將其位置的默認(rèn)值0,修改成1。

2.元素niu同理落到了數(shù)組下標(biāo)為1,3,4的位置上,并將其位置的默認(rèn)值0,修改成1。

此時(shí)bitmap中已經(jīng)存儲了tieniu數(shù)據(jù)元素。

當(dāng)請求想通過布隆過濾器判斷tie元素在程序中是否存在時(shí),通過hash運(yùn)算結(jié)果到數(shù)組對應(yīng)下標(biāo)位置上發(fā)現(xiàn)值已經(jīng)都被置為1,此時(shí)返回true。

5.3 “一定不在集合中”

如圖所示:

​ 元素zhang通過布隆過濾器判斷時(shí),下標(biāo)0,2都為0,則直接返回false。

也就是當(dāng)判斷不在bitmap中的元素時(shí),經(jīng)過hash運(yùn)算得到的結(jié)果在bitmap中只要有一個(gè)為0,則該數(shù)據(jù)一定不存在。

5.4 “可能在集合中”

如圖所示:

​ 元素shuaibi通過布隆過濾器判斷時(shí),hash運(yùn)算的結(jié)果落到了下標(biāo)1,3,8上,此時(shí)對應(yīng)下標(biāo)位置的值都為1,則直接返回true。

這下就尷尬了,因?yàn)閷?shí)際程序中并沒有數(shù)據(jù)shuaibi,但布隆過濾器返回的結(jié)果顯示有這個(gè)元素。這就是布隆過濾器的缺點(diǎn),存在誤判情況。

5.5 ”刪除困難“

為什么布隆過濾器刪除困難呢,如圖所示:

如果刪除了“tie”元素,4號位被置為0,則會影響niu元素的判斷,因?yàn)?code>4號位為0,進(jìn)行數(shù)據(jù)校驗(yàn)時(shí)返回0,則會認(rèn)為程序中沒有niu元素。

那小伙伴會問,4號位不置為0,行不行?

如果刪除了元素,hash碰撞的數(shù)組下標(biāo)不置為0,那么如果繼續(xù)驗(yàn)證該元素的話,布隆過濾器會繼續(xù)返回true,但實(shí)際上元素已經(jīng)刪除了。

所以布隆過濾器數(shù)據(jù)刪除困難,如果要?jiǎng)h除的話,可以參考Counting Bloom Filter

5.6 為什么不使用HashMap呢?

如果用HashSet或Hashmap存儲的話,每一個(gè)用戶ID都要存成int,占4個(gè)字節(jié)即32bit。而一個(gè)用戶在bitmap中只需要1個(gè)bit,內(nèi)存節(jié)省了32倍。

并且大數(shù)據(jù)量會產(chǎn)生大量的hash沖突,結(jié)果就是產(chǎn)生hash沖突的數(shù)據(jù),仍然會進(jìn)行遍歷挨個(gè)比對(即使轉(zhuǎn)成紅黑樹),這樣對內(nèi)存空間和查詢效率的提升,仍然是有限的。

當(dāng)然:數(shù)據(jù)量不大時(shí),盡管使用。而且hashmap方便進(jìn)行CRUD😂

到此這篇關(guān)于詳解緩存穿透/擊穿/雪崩原理及其解決方案的文章就介紹到這了,更多相關(guān)緩存穿透/擊穿/雪崩內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • java若依框架集成redis緩存詳解
  • Redis使用元素刪除的布隆過濾器來解決緩存穿透問題
  • 關(guān)于redisson緩存序列化的幾枚大坑說明
  • springboot使用Redis作緩存使用入門教程
  • 淺談Redis 緩存的三大問題及其解決方案
  • 淺談java如何實(shí)現(xiàn)Redis的LRU緩存機(jī)制
  • 在項(xiàng)目中使用redis做緩存的一些思路

標(biāo)簽:吉安 大慶 果洛 北京 江蘇 楊凌 朝陽 臺州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解Redis緩存穿透/擊穿/雪崩原理及其解決方案》,本文關(guān)鍵詞  詳解,Redis,緩存,穿透,擊穿,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解Redis緩存穿透/擊穿/雪崩原理及其解決方案》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳解Redis緩存穿透/擊穿/雪崩原理及其解決方案的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    甘肃省| 益阳市| 万州区| 锡林郭勒盟| 遂宁市| 天气| 扬中市| 法库县| 伊宁县| 乌什县| 南康市| 进贤县| 泰兴市| 昌江| 峨眉山市| 蓬莱市| 石泉县| 广饶县| 林周县| 内乡县| 盘山县| 北流市| 扬州市| 威远县| 仁怀市| 长武县| 延庆县| 武宣县| 泗阳县| 禹州市| 凤阳县| 杂多县| 京山县| 阜新市| 怀安县| 黄大仙区| 唐山市| 互助| 太康县| 苍山县| 汾阳市|