表格缓存问题_缓存常见问题,一网打尽哦!
勾哥:昨天發了一篇翻譯,英語水平一般般的我摳了半天字眼,一個 word 一個 word 翻譯過來,竟然被舉報了?!
哈?舉報的那位兄弟你是鹽吃多么
今天更新一篇緩存的常見問題,對很多開發老哥都能有幫助,盡量沒搞難度特別大,寫的簡單的很!有意見可以正常反饋~
(女神帶我避開杠精!)~~~以下正文~~~
對使用緩存時常遇到幾個問題,整理出了一個表格。
1. 緩存更新方式
第一個問題是緩存更新方式,這是決定在使用緩存時就該考慮的問題。
緩存的數據在數據源發生變更時需要對緩存進行更新,數據源可能是 DB,也可能是遠程服務。
更新的方式可以是主動更新。
數據源是 DB 時,可以在更新完 DB 后就直接更新緩存。
當數據源不是 DB 而是其他遠程服務,可能無法及時主動感知數據變更,這種情況下一般會選擇對緩存數據設置失效期,也就是數據不一致的最大容忍時間。
這種場景下,可以選擇失效更新,key 不存在或失效時先請求數據源獲取最新數據,然后再次緩存,并更新失效期。
但這樣做有個問題,如果依賴的遠程服務在更新時出現異常,則會導致數據不可用。
改進的辦法是異步更新,就是當失效時先不清除數據,繼續使用舊的數據,然后由異步線程去執行更新任務。這樣就避免了失效瞬間的空窗期。
另外還有一種純異步更新方式,定時對數據進行分批更新。實際使用時可以根據業務場景選擇更新方式。
2. 數據不一致
第二個問題是數據不一致的問題,可以說只要使用緩存,就要考慮如何面對這個問題。
緩存不一致產生的原因一般是主動更新失敗,例如更新 DB 后,更新 Redis 因為網絡原因請求超時;或者是異步更新失敗導致。
解決的辦法——
- 如果服務對耗時不是特別敏感可以增加重試。
- 如果服務對耗時敏感可以通過異步補償任務來處理失敗的更新。
- 或者短期的數據不一致不會影響業務,那么只要下次更新時可以成功,能保證最終一致性就可以。
3. 緩存穿透
第三個問題是緩存穿透。
產生這個問題的原因可能是外部的惡意攻擊,例如,對用戶信息進行了緩存,但惡意攻擊者使用不存在的用戶 ID 頻繁請求接口,導致查詢緩存不命中,然后穿透 DB 查詢依然不命中。這時會有大量請求穿透緩存訪問到 DB。
解決的辦法——
- 對不存在的用戶,在緩存中保存一個空對象進行標記,防止相同 ID 再次訪問 DB,不過有時這個方法并不能很好解決問題,可能導致緩存中存儲大量無用數據。
- 使用 BloomFilter 過濾器,BloomFilter 的特點是存在性檢測,如果 BloomFilter 中不存在,那么數據一定不存在;如果 BloomFilter 中存在,實際數據也有可能會不存在。非常適合解決這類的問題。
4. 緩存擊穿
第四個問題是緩存擊穿,就是某個熱點數據失效時,大量針對這個數據的請求會穿透到數據源。
解決這個問題有這些辦法——
- 可以使用互斥鎖更新,保證同一個進程中針對同一個數據不會并發請求到 DB,減小 DB 壓力。
- 使用隨機退避方式,失效時隨機 sleep 一個很短的時間,再次查詢,如果失敗再執行更新。
- 針對多個熱點 key 同時失效的問題,可以在緩存時使用固定時間加上一個小的隨機數,避免大量熱點 key 同一時刻失效。
5. 緩存雪崩
第五個問題是緩存雪崩。產生的原因是緩存掛掉,這時所有的請求都會穿透到 DB。
解決方法——
- 使用快速失敗的熔斷策略,減少 DB 瞬間壓力。
- 使用主從模式和集群模式來盡量保證緩存服務的高可用。
- 實際場景中,這兩種方法會結合使用。
考察點與加分項
這部分主要面試考察點是對緩存特性的理解,對 MC、Redis 的特點和使用方式的掌握。
1. 要知道緩存的使用場景,不同類型緩存的使用方式,例如:
- 對 DB 熱點數據進行緩存減少 DB 壓力;對依賴的服務進行緩存,提高并發性能
- 單純 K-V 緩存的場景可以使用 MC,而需要緩存 list、set 等特殊數據格式,可以使用 Redis
- 需要緩存一個用戶最近播放視頻的列表可以使用 Redis 的 list 來保存、需要計算排行榜數據時,可以使用 Redis 的 zset 結構來保存
2. 要了解 MC 和 Redis 的常用命令,例如:
- 原子增減、對不同數據結構進行操作的命令等
- 了解 MC 和 Redis 在內存中的存儲結構,這對評估使用容量會很有幫助
- 了解 MC 和 Redis 的數據失效方式和剔除策略,比如主動觸發的定期剔除和被動觸發延期剔除
3. 要理解 Redis 的持久化、主從同步與 Cluster 部署的原理,例如:
- RDB 和 AOF 的實現方式與區別
如果想要在面試中獲得更好的表現,還應了解下面這些加分項。
1. 要結合實際應用場景來介紹緩存的使用,例如:
- 調用后端服務接口獲取信息時,可以使用本地+遠程的多級緩存
- 對于動態排行榜類的場景可以考慮通過 Redis 的 sorted set 來實現等等
2. 最好有過分布式緩存設計和使用經驗,例如:
- 項目中在什么場景使用過 Redis,使用了什么數據結構,解決哪類的問題
- 使用 MC 時根據預估值大小調整 McSlab 分配參數等等
3. 最好可以了解緩存使用中可能產生的問題,例如:
- Redis 是單線程處理請求,應盡量避免耗時較高的單個請求任務,防止相互影響
- Redis 服務應避免和其他 CPU 密集型的進程部署在同一機器
- 禁用 Swap 內存交換,防止 Redis 的緩存數據交換到硬盤上,影響性能
- MC 鈣化問題等等
4. 要了解 Redis 的典型應用場景,例如:
- 使用 Redis 來實現分布式鎖
- 使用 Bitmap 來實現 BloomFilter
- 使用 HyperLogLog 來進行 UV 統計等等
5. 知道 Redis4.0、5.0 中的新特性,例如:
- 支持多播的可持久化消息隊列 Stream
- 通過 Module 系統來進行定制功能擴展等等
本文首發在公號:勾勾的Java宇宙
歡迎大家來找勾哥交流探討技術!
總結
以上是生活随笔為你收集整理的表格缓存问题_缓存常见问题,一网打尽哦!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式烤箱能不能放台面上_2021年开放
- 下一篇: el表达式动态取值中括号内两点_中考热点