高并發(fā)下緩存失效問題及解決方案
0x01: 緩存穿透
當(dāng)查詢一個(gè)不存在的數(shù)據(jù),此時(shí)緩存是不命中的,就會(huì)去查詢 db,這將導(dǎo)致每次查詢這個(gè)不存在的數(shù)據(jù)都要去訪問 db,緩存就沒有意義了。如果不懷好意的人利用不存在的數(shù)據(jù)進(jìn)行攻擊,可能導(dǎo)致數(shù)據(jù)庫崩潰。
解決方案:
查詢到的不存在的數(shù)據(jù)也放入緩存,可以存為 null,并加入短暫的過期時(shí)間(但如果別人每次都請求不同的 key,會(huì)導(dǎo)致大量無用 key 存在 redis 中)
加個(gè)過濾器(比如布隆過濾器),過濾不存在的 key
0x02: 緩存雪崩
系統(tǒng)中設(shè)置某個(gè) key 時(shí),使用了相同的過期時(shí)間,導(dǎo)致緩存在同一時(shí)間失效,請求涌入 db,導(dǎo)致數(shù)據(jù)庫壓力過重雪崩。
解決方案:
在原有的失效時(shí)間基礎(chǔ)上加上一個(gè)隨機(jī)值,比如 1~5 分鐘,這樣每一個(gè)緩存過期時(shí)間的重復(fù)率就會(huì)變低,就很難引起集體失效的事件。
0x03: 緩存擊穿
對于一些設(shè)置了過期時(shí)間的 key,如果這些 key 可能會(huì)在某些時(shí)間點(diǎn)被超高并發(fā)地訪問,是一種非?!盁狳c(diǎn)”的數(shù)據(jù)。如果這個(gè) key 在大量請求同時(shí)進(jìn)來前正好失效,那么所有對這個(gè) key 的數(shù)據(jù)查詢都落到 db,我們稱為緩存擊穿。
解決方案:
加鎖。大量并發(fā)只讓一個(gè)去查,其他人等待,查到以后釋放鎖,其他人獲取到鎖,先查緩存,就會(huì)有數(shù)據(jù),不用去db
設(shè)置熱點(diǎn)數(shù)據(jù)永不過期
在 redis、db 中間做一個(gè)二級緩存

喜歡,在看
