網站首頁 編程語言 正文
Redis中可以設置數據的生命周期,那么當數據過期時,Redis是怎么對這些數據進行刪除的呢?
Redis有三種刪除策略:
1.定時刪除:創建一個定時器,當key過期時,定時器立即刪除過期數據。這樣做節約內存,但是cpu負荷高,由于redis時單線程的,在訪問量大時,甚至會引起線程阻塞。
2.惰性刪除:?數據到達過期時間,不做處理。等下次訪問該數據時,如果未過期,返回數據。如果已過期,刪除,返回不存在。這樣CPU壓力會降低,但是內存壓力很大,長期有過期數據占用內存。
3.定期刪除:這種策略平衡了前兩種極端的方案,Redis啟動服務器初始化時,讀取配置server.hz的值,默認為10.每秒執行server.hz次的serverCron()中的方法,周期性的輪詢redis庫中的時效型數據,采用隨機抽取的策略,利用過期數據占比的方式控制刪除頻度(過期數據的比例不超過25%)。
定期刪除的優點在于CPU性能占用設置有峰值,檢測頻度可自定義,內存壓力和CPU壓力都不大。但是僅僅是通過給key設置時長還是有問題的,因為還是有很多過期key堆積在內存中,容易引起Out Of Memory。那么如何解決這方面的問題呢?就是Redis的內存淘汰機制(逐出算法)。
Redis使用內存存儲數據,在執行沒一個命令前,會調用FreeMemoryIFNeeded()檢查內存是否充足,如果內存不滿足新加入數據的最低存儲要求,redis要刪除一些數據為清理空間。清理的策略被稱為逐出算法:
Redis目前有8種逐出策略:
1.volatile-lru:從已設置過期時間的數據中,挑選最近最少使用的數據淘汰。(針對時間)
2.volatile-lfu:從已設置過期時間的數據中,挑選最近使用次數最少的數據淘汰。(針對訪問頻率)
3.volatile-ttl:從已設置過期時間的數據中,挑選快要過期的數據。
4.volatile-random:從已設置過期時間的數據中,任意選擇數據淘汰。
5.allkeys-lru:在所有的key中,移除最近最少使用的key。
6.allkeys-lfu:在所有的key中,移除最近使用次數最少的key。
7.allkeys-random:任意挑選數據淘汰。
8.no-eviction:禁止驅逐數據(Redis4.0默認策略)。
需要注意的時,逐出過程并不是100%的能夠清理出足夠的空間,如果不成功反復執行,在所有數據都嘗試完畢后,如果還是不能滿足內存清理的要求,將會出現錯誤信息。
(error) OOM command not allowed when used memory >'maxmemory'
處理數據刪除,需要注意的還有緩存的一些問題。
分別有
緩存預熱:在系統啟動前,提交將相關的緩存數據直接加載到緩存系統,避免在用戶請求的時候,先查數據庫,然后再緩存數據的問題,
緩存雪崩:大面積key同一時間失效,所有請求直接落在數據庫上,造成數據庫壓力過大,可能導致服務器宕機。
解決方案:1.更多的頁面靜態化處理;
? ? ? ? ? ? ? ? ? 2.構造多級緩存
? ? ? ? ? ? ? ? ? 3.災難預警機制
? ? ? ? ? ? ? ? ? 4.限流,降級(短時間犧牲客戶體驗,限制一部分請求,降低服務器壓力,待業務低速運轉后,再逐步放開)
? ? ? ? ? ? ? ? ? 5.刪除策略進行切換(lru->lfu)
? ? ? ? ? ? ? ? ? 6.數據分類,有效期策略調整(稀釋集中到期的key的數量)
? ? ? ? ? ? ? ? ? 7.超熱數據 永久key
緩存擊穿:某個熱點key過期,大量請求落在服務器。
解決方案:1.二級緩存
? ? ? ? ? ? ? ? ? ?2.設置永久key
? ? ? ? ? ? ? ? ? ?3.延長過期時間,待訪問量降低后移除
緩存穿透:redis出現大面積未命中(請求的key不在redis中,直接落在服務器)
?解決方案:1.布隆過濾器
? ? ? ? ? ? ? ? ? ? 2.緩存null
? ? ? ? ? ? ? ? ? ? 3.做好參數校驗
? ? ? ? ? ? ? ? ? ? 4.實時監控(redis的命中率)
? ? ? ? ? ? ? ? ? ? 5.key加密(不滿足直接駁回)
? ?
原文鏈接:https://blog.csdn.net/weixin_71419462/article/details/126432530
相關推薦
- 2022-11-23 pytorch?tensorboard可視化的使用詳解_python
- 2022-12-27 Go學習筆記之map的聲明和初始化_Golang
- 2022-06-17 Go模板template用法詳解_Golang
- 2023-07-18 漏桶算法和令牌桶算法
- 2022-09-13 本地使用Docker搭建go開發環境的全過程_Golang
- 2023-03-13 React中遍歷數組生成標簽問題_React
- 2022-08-27 教你使用Python的pygame模塊實現拼圖游戲_python
- 2022-10-14 Sklearn中predict_proba函數用法及原理詳解
- 最近更新
-
- 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同步修改后的遠程分支