網站首頁 編程語言 正文
緩存問題
1. 緩存穿透---查不到
緩存穿透是指用戶想查詢一個數據,發現Redis中沒有,也就是緩存沒有命中,就向持久性數據庫發起查詢,發現數據庫也沒有這個數據,于是查詢失敗了。
當用戶請求很多的情況下,緩存沒有命中,數據庫也沒有數據,會給數據庫造成很大的壓力,這就是緩存穿透。
解決方案
第一種解決方案:使用布隆過濾器
使用布隆過濾器之后,將存儲的數據放入布隆過濾器中,每次數據查詢首先查詢布隆過濾器,當在過濾器中判斷存在時,再到緩存查詢,如果沒有,再進入數據查詢。
如果在布隆過濾器中不存在,則直接返回告訴用戶該數據查不到,這樣能大大減輕數據庫查詢壓力。
第二種方案:緩存空對象
當數據庫數據不存在時,將返回的空對象緩存起來,同時設置一個過期時間,之后在訪問數據時,將從緩存中獲取,從而保護了數據庫。
存在問題:
對空值設置過期時間,會存在更新數據庫數據到緩存數據失效的這一段時間,緩存數據有問題(問題在于緩存的空對象數據,由于還沒有過期,但此時數據庫數據已經更新了),會對要保證數據一致性的業務造成影響。會需要更多的空間來存儲更多的控制,造成內存中有大量的空值的鍵。
2. 緩存擊穿---量太大,緩存過期
緩存擊穿是指一個熱點key,在不停的扛著大量的并發,當key在失效的瞬間,持續的大并發就會穿破緩存,直接請求到數據庫。對數據庫造成瞬間壓力過大。
解決方案
第一種方案:熱點數據永不過期
從緩存角度看,沒有設置過期時間,就不會存在緩存過期之后產生的問題。
第二種方案:加互斥鎖
使用分布式鎖,保證對每個key的訪問同一時刻只能一個線程去查詢后端服務,其他沒有獲取鎖權限的線程則等待即可。
3. 緩存雪崩
緩存雪崩是指在某一個時間段,緩存集中過期失效或者Redis宕機
對于數據庫而言,所有請求壓力會全部到達數據庫,導致數據庫調用量暴增,可能也造成數據庫宕機的情況
解決方案
第一種方案(預防為主):Redis采用高可用
這種方案的思路就是集群使用,即使一個redis掛掉,其他redis還可以繼續服務。
第二種方案(降低發生時所造成的危害):限流降級
這種思路就是在緩存失效后,通過加鎖或者隊列來控制讀取數據庫的線程數量讓線程在隊列排隊,控制整體請請求速率。
第三種方案:數據預熱
數據預熱即是在正式部署服務之前,先訪問一遍數據,可以將大部分的數據加載到緩存中,在即將發生大并發之前已經加載不同的key,設置不同的過期時間,讓緩存失效的時間更加均勻。
原文鏈接:https://blog.csdn.net/qq_45981295/article/details/121666465
相關推薦
- 2022-05-13 在 Dart 中更好地使用類和 Mixin
- 2022-04-03 Rust?連接?PostgreSQL?數據庫的詳細過程_PostgreSQL
- 2022-10-19 R語言初學者的一些常見報錯指南_R語言
- 2022-05-06 利用python實現蝴蝶曲線_python
- 2022-07-17 C#實現子類與父類的相互轉換_C#教程
- 2023-01-03 python中import和from-import的區別解析_python
- 2022-08-23 使用Python腳本提取基因組指定位置序列_python
- 2022-07-22 python:實現從給定的子串列表返回包含所有可能的列表算法(附完整源碼)
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支