更新時間:2021-04-30 來源:黑馬程序員 瀏覽量:
1.純內(nèi)存操作。
2.單線程操作,避免了頻繁的上下文切換。
3.采用了非阻塞I/O多路復(fù)用機(jī)制。
I/O多路復(fù)用機(jī)制:I/O多路復(fù)用就是只有單個線程,通過跟蹤每個I/O流的狀態(tài),來管理多個I/O流。
緩存和數(shù)據(jù)庫雙寫一致性問題
一致性的問題很常見,因為加入了緩存之后,請求是先從Redis 中查詢,如果Redis 中存在數(shù)據(jù)就不會走數(shù)據(jù)庫了,如果不能保證緩存跟數(shù)據(jù)庫的一致性就會導(dǎo)致請求獲取到的數(shù)據(jù)不是最新的數(shù)據(jù)。
解決方案:
1、編寫刪除緩存的接口,在更新數(shù)據(jù)庫的同時,調(diào)用刪除緩存的接口刪除緩存中的數(shù)據(jù)。這么做會有耦合高以及調(diào)用接口失敗的情況。
2、消息隊列:ActiveMQ,消息通知。
緩存的并發(fā)競爭問題
并發(fā)競爭,指的是同時有多個子系統(tǒng)去set 同一個key值。
解決方案:最簡單的方式就是準(zhǔn)備一個分布式鎖,大家去搶鎖,搶到鎖就做set操作即可。
緩存雪崩問題
緩存雪崩,即緩存同一時間大面積的失效,這個時候又來了一波請求,結(jié)果請求都懟到數(shù)據(jù)庫上,從而導(dǎo)致數(shù)據(jù)庫連接異常。
解決方案:
1.給緩存的失效時間,加上一個隨機(jī)值,避免集體失效。
2.使用互斥鎖,但是該方案吞吐量明顯下降了。
3.搭建Redis 集群。
緩存擊穿問題
緩存穿透,即黑客故意去請求緩存中不存在的數(shù)據(jù),導(dǎo)致所有的請求都懟到數(shù)據(jù)庫上,從而數(shù)據(jù)庫連接異常。
解決方案:
1、利用互斥鎖,緩存失效的時候,先去獲得鎖,得到鎖了,再去請求數(shù)據(jù)庫。沒得到鎖,則休眠一段時間重試。
2、采用異步更新策略,無論key 是否取到值,都直接返回,value 值中維護(hù)一個緩存失效時間,緩存如果過期,異步起一個線程去讀數(shù)據(jù)庫,更新緩存。
猜你喜歡: