昆明網(wǎng)站建設(shè)論壇策劃營(yíng)銷(xiāo)
Redis緩存雪崩、穿透、擊穿
- 解決方案
- 正常的緩存流程
- Redis緩存雪崩
- Redis緩存雪崩解決方案
- Redis緩存穿透
- Redis緩存穿透解決方案
- Redis緩存擊穿
- Redis緩存擊穿解決方案
解決方案
布隆過(guò)濾器,分布式鎖
正常的緩存流程
Redis緩存雪崩
Redis中的key大面積失效,導(dǎo)致軟件直接和數(shù)據(jù)庫(kù)進(jìn)行溝通,把請(qǐng)求都打到了數(shù)據(jù)庫(kù)上。
這就是緩存雪崩,大量的redis在同一時(shí)間失效。
Redis緩存雪崩解決方案
- 設(shè)置緩存的失效時(shí)間,讓它不要在同一時(shí)間失效。
- 在我們?cè)O(shè)置這個(gè)緩存的時(shí)候,隨機(jī)初始化它的失效時(shí)間,這樣的話就不會(huì)讓所有緩存在同一時(shí)間失效,把所有請(qǐng)求都打到數(shù)據(jù)庫(kù)上。
- redis一般都是集群部署,我們將熱點(diǎn)的key放到不同的節(jié)點(diǎn)上去。讓熱點(diǎn)的緩存平均分布在不同的redis節(jié)點(diǎn)上。
- 不設(shè)置緩存失效的時(shí)間。
- 跑定時(shí)任務(wù),定時(shí)刷緩存,例如緩存設(shè)置了三小時(shí)時(shí)效,在時(shí)效之前,把redis緩存給他重新跑進(jìn)去,然后再設(shè)置三小時(shí),不斷地用這個(gè)定時(shí)任務(wù)去刷新這個(gè)緩存,這個(gè)緩存就不會(huì)失效。
Redis緩存穿透
數(shù)據(jù)庫(kù)的主鍵就是從0開(kāi)始遞增的,沒(méi)有負(fù)數(shù)。黑客不斷利用id小于零的這個(gè)參數(shù)發(fā)請(qǐng)求。redis中查不到便會(huì)不斷地將這個(gè)請(qǐng)求打到數(shù)據(jù)庫(kù)上。
redis直接被這種數(shù)據(jù)穿透了,惡意用戶(hù)去請(qǐng)求軟件,然后用這個(gè)id等于負(fù)一的數(shù)據(jù)去請(qǐng)求。redis和數(shù)據(jù)庫(kù)都沒(méi)有這樣的數(shù)據(jù),一般出現(xiàn)這種情況都不是正常的用戶(hù),而是一些惡意的用戶(hù)。
Redis緩存穿透解決方案
- 這個(gè)請(qǐng)求穿透redis到這個(gè)數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)無(wú)論查出什么請(qǐng)求,空或者有值都會(huì)緩存到redis中去。這樣下次用同一個(gè)參數(shù)來(lái)發(fā)請(qǐng)求的時(shí)候,就不會(huì)穿透這個(gè)redis。但是他可能會(huì)換不同的參數(shù)。
- 拉黑IP,但是對(duì)方也可能更換不同的IP。
- 對(duì)參數(shù)的合法性檢驗(yàn),再判斷這個(gè)參數(shù)不合法的時(shí)候,直接return掉。
- 使用布隆過(guò)濾器。
Redis緩存擊穿
大量的用戶(hù)請(qǐng)求去不斷地訪問(wèn)這個(gè)熱點(diǎn)的key,當(dāng)這個(gè)熱點(diǎn)的key突然失效,把請(qǐng)求打到數(shù)據(jù)庫(kù)上,這個(gè)過(guò)程就叫做擊穿。他是擊穿一個(gè)非常熱點(diǎn)的key。
Redis緩存擊穿解決方案
- 讓這個(gè)緩存永遠(yuǎn)不過(guò)期。
- 使用分布式鎖。如果是單體應(yīng)用的話,就可以使用互斥鎖。
請(qǐng)求數(shù)據(jù)庫(kù)這一步上鎖,只有拿到鎖的線程可以操作這個(gè)數(shù)據(jù)庫(kù)。這個(gè)時(shí)候?qū)?shù)據(jù)庫(kù)的壓力就非常小。當(dāng)他查詢(xún)到這個(gè)數(shù)據(jù)之后再將緩存重新寫(xiě)到redis里面去。其他沒(méi)有搶到鎖的數(shù)據(jù)讓他先睡幾毫秒,然后再重新去redis里面去查詢(xún)數(shù)據(jù)。
參考資料:什么是Redis緩存雪崩、穿透、擊穿,十分鐘給你講的明明白白