作用:加速讀寫,降低數(shù)據(jù)庫的訪問負載
存在的問題:數(shù)據(jù)不一致墓臭,緩存層和數(shù)據(jù)層有段時間不一致問題赚瘦,與更新策略有關(guān)
緩存更新策略
1.LRU/LFU/FIFO算法剔除
- maxmemory-policy: 最大內(nèi)存剔除策略 過期鍵執(zhí)行LRU
2.超時剔除
- expire:設(shè)置過期時間(問題是沒過期時數(shù)據(jù)變化,數(shù)據(jù)不一致)
3.主動更新
- 開發(fā)控制生命周期轩褐,刪除緩存重新獲取數(shù)據(jù)
推薦使用更新策略:
1.低一致性:最大內(nèi)存
2.高一致性:超時與主動更新結(jié)合,最大內(nèi)存防備(避免內(nèi)存超過最大內(nèi)存出現(xiàn)問題)
緩存粒度控制
在MySQL中獲取數(shù)據(jù)如:select * from user where id={id}
設(shè)置用戶信息緩存如:set user:{id} "用戶數(shù)據(jù)"
-
緩存的粒度:
全部屬性字段
部分重要字段
比較:
- 通用性:全量屬性更好
- 占用空間:部分屬性更好
- 代碼維護:表面上全量屬性更好
綜合具體數(shù)據(jù)使用不同的粒度报咳,對用戶數(shù)據(jù)容易擴展使用全量侠讯,對于開發(fā)的一些功能可能后期不會有很大變化使用部分屬性
緩存雪崩
緩存層服務(wù)異常,大量請求直接達到存儲層暑刃,造成故障厢漩,
1.保證緩存的高可用
- 如:redis cluster, redis sentinel
2.使用隔離組件限流
- 如:Hystrix
3.提前演練
- 如:壓力測試
優(yōu)化io的方法:
1.命令本身優(yōu)化 如:慢查詢key hgetall
2.減少網(wǎng)絡(luò)通信的次數(shù)
3.降低接入成本 如:長連接連接池
批量優(yōu)化方法:
1.串行mget
2.串行io
- pipeline流水線
3.并行io
- 使用并行特性
緩存穿透
訪問的數(shù)據(jù)緩存中沒有岩臣,繼續(xù)請求存儲層溜嗜,如果存儲層也沒有數(shù)據(jù),大量請求會到存儲層加大存儲層的負載
發(fā)現(xiàn)緩存穿透:
1.業(yè)務(wù)的請求時間
2.業(yè)務(wù)出現(xiàn)問題
3.監(jiān)測指標:緩存命中數(shù)架谎,存儲層命中數(shù)炸宵,采集每分鐘的變化
解決方法:
1.緩存空對象(確定數(shù)據(jù)不存在 ,設(shè)置過期時間10min根據(jù)具體業(yè)務(wù)定 谷扣,減少storage的負載)
-
存在的問題:
1.需要更多的鍵(設(shè)置過期時間,避免導致后面的數(shù)據(jù)問題)
2.緩存層與存儲層短期不一致(使用訂閱消息土全,有數(shù)據(jù)刷新緩存)
2.布隆過濾器攔截
所有的key放到布隆過濾器中,不存在的key進行攔截 会涎,需要實時更新布隆過濾器中的key
熱點key重建
熱點key訪問量大涯曲,重建的時間長,導致很多線程重建在塔,加大了存儲層負載
解決方法:
1.互斥鎖 mutex lock
- 缺點:會有大量線程阻塞
2.永不過期
沒有設(shè)置過期時間,為每個value設(shè)置邏輯過期時間拨黔,超過邏輯過期時間使用單獨的線程去重建緩存
- 缺點:過期到緩存重建的時間間隙數(shù)據(jù)不一致