緩存的意義
1:緩存一般都在內(nèi)存中操作郎任,性能比數(shù)據(jù)庫(kù)高。
2:緩存資源的消耗相比數(shù)據(jù)庫(kù)資源的消耗更低霉猛。
基于提高應(yīng)用性能的目的,使用緩存提升了數(shù)據(jù)處理的性能,降低數(shù)據(jù)存儲(chǔ)的消耗,提高了數(shù)據(jù)訪問(wèn)的響應(yīng)時(shí)間。
緩存雪崩
- 問(wèn)題點(diǎn):
當(dāng)大量的緩存key設(shè)置的過(guò)期時(shí)間都是同一個(gè)時(shí)間點(diǎn)画饥,那么當(dāng)?shù)竭_(dá)這個(gè)時(shí)間點(diǎn)時(shí),大量的緩存key失效,導(dǎo)致請(qǐng)求全部落地到數(shù)據(jù)庫(kù),造成數(shù)據(jù)庫(kù)瞬間并發(fā)請(qǐng)求提高,帶來(lái)雪崩問(wèn)題祖搓。
- 解決方案:
1:過(guò)期時(shí)間添加隨機(jī)值镐作,將相同過(guò)期時(shí)間點(diǎn)概率降低包各。(弊端:緩存失效時(shí)間不能準(zhǔn)確的管理)
2:緩存不設(shè)置過(guò)期時(shí)間摘仅,通過(guò)更新操作更新緩存。(弊端:更新失敗问畅,緩存一致性問(wèn)題)
緩存穿透
- 問(wèn)題點(diǎn):
請(qǐng)求的key娃属,在緩存及db中都不存在,數(shù)據(jù)庫(kù)查詢不存在护姆,不進(jìn)行緩存設(shè)置矾端,導(dǎo)致每次請(qǐng)求都落地到數(shù)據(jù)庫(kù)。如果是惡意的請(qǐng)求卵皂,將造成數(shù)據(jù)庫(kù)壓力過(guò)大秩铆。例如:業(yè)務(wù)id是數(shù)據(jù)庫(kù)自增的,使用id為-1的請(qǐng)求參,那么每次都會(huì)查詢數(shù)據(jù)庫(kù)殴玛,而且數(shù)據(jù)不存在捅膘。
- 解決方案:
1:將不存在的key也緩存,設(shè)置value為特定業(yè)務(wù)值及合適的過(guò)期時(shí)間滚粟。那么請(qǐng)求過(guò)來(lái)時(shí)寻仗,換查詢緩存,并且在過(guò)期時(shí)間內(nèi)不會(huì)落地?cái)?shù)據(jù)庫(kù)凡壤。(弊端:當(dāng)數(shù)據(jù)庫(kù)出現(xiàn)新的id署尤,且之前緩存已經(jīng)被設(shè)置為控制,那么過(guò)期時(shí)間內(nèi)無(wú)法訪問(wèn)新增的數(shù)據(jù))
2:布隆過(guò)濾器亚侠,將所有可能存在的id存儲(chǔ)在一個(gè)bitmap曹体,請(qǐng)求前先經(jīng)過(guò)過(guò)濾器判斷是否存在。(弊端:存在誤判的可能)
緩存擊穿
- 問(wèn)題點(diǎn):
對(duì)于某個(gè)熱點(diǎn)key硝烂,每秒并發(fā)很高混坞,在key失效的時(shí)間點(diǎn),瞬間并發(fā)請(qǐng)求同時(shí)查詢數(shù)據(jù)庫(kù)钢坦,導(dǎo)致數(shù)據(jù)庫(kù)壓力瞬時(shí)暴漲究孕。如果這樣的key很多,而且當(dāng)存在跟緩存雪崩一樣問(wèn)題的情況爹凹,數(shù)據(jù)庫(kù)無(wú)疑壓力更大厨诸。
- 解決方案:
1:熱點(diǎn)key不設(shè)置過(guò)期時(shí)間,通過(guò)更新操作同步禾酱。(弊端:更新失敗帶來(lái)的一致性問(wèn)題)
2:通過(guò)鎖機(jī)制微酬,只允許一個(gè)請(qǐng)求查庫(kù)同,時(shí)可以考慮使用緩存降級(jí)颤陶,獲得鎖失敗的進(jìn)程查詢降級(jí)的緩存颗管。(弊端:互斥鎖帶來(lái)的性能問(wèn)題,導(dǎo)致其他線程在等待)