## 一、redis如何清理過期key
redis出于性能上的考慮,無法做到對每一個過期的key進行即時的過期監聽和刪除。但是redis提供了其它的方法來清理過期的key。
#### 1.被動清理
當用戶主動訪問一個過期的key時,redis會將其直接從內存中刪除。
#### 2.主動清理
在redis的持久化中,我們知道redis為了保持系統的穩定性,健壯性,會周期性的執行一個函數。在這個過程中,會進行之前已經提到過的自動的持久化操作,同時也會進行內存的主動清理。
在內存主動清理的過程中,redis采用了一個隨機算法來進行這個過程:簡單來說,redis會隨機的抽取N(默認100)個被設置了過期時間的key,檢查這其中已經過期的key,將其清除。同時,如果這其中已經過期的key超過了一定的百分比M(默認是25),則將繼續執行一次主動清理,直至過期key的百分比在概率上降低到M以下。
#### 3.內存不足時觸發主動清理
在redis的內存不足時,也會觸發主動清理。
## 二、redis內存不足時的策略
redis是一個基于內存的數據庫,如果存儲的數據量很大,達到了內存限制的最大值,將會出現內存不足的問題。redis允許用戶通過配置maxmemory-policy參數,指定redis在內存不足時的解決策略
1. **volatile-lru**?使用LRU算法刪除一個鍵(只針對設置了過期時間的key)
2. **allkeys-lru**?使用LRU算法刪除一個鍵
3. **volatile-lfu**?使用LFU算法刪除一個鍵(只針對設置了過期時間的鍵)
4. **allkeys-lfu**?使用LFU算法刪除一個鍵
5. **volatile-random**?隨機刪除一個鍵(只針對設置了過期時間的鍵)
6. **allkeys-random**?隨機刪除一個鍵
7. **volatile-ttl**刪除最早過期的一個鍵
8. **noeviction**?不刪除鍵,返回錯誤信息**(redis默認選項)**
對于只針對設置了過期時間的鍵進行刪除的策略,在所有的可被刪除的鍵(非永久的鍵)都被刪除時內存依然不足,將會拋出錯誤。
其中,LRU算法--->最近最少使用算法,較為注重于時間;LFU算法--->最近最不常用算法,較為注重于被訪問頻率。
redis的內存置換算法和操作系統中的內存置換算法類似,就不在這里展開了。
> 原文閱讀:https://www.cnblogs.com/sunshine-long/p/12706868.html
- 前言
- 第一部分 計算機網絡與操作系統
- 大量的 TIME_WAIT 狀態 TCP 連接,對業務有什么影響?怎么處理?
- 性能占用
- 第二部分 Java基礎
- 2-1 JVM
- JVM整體結構
- 方法區
- JVM的生命周期
- 堆對象結構
- 垃圾回收
- 調優案例
- 類加載機制
- 執行引擎
- 類文件結構
- 2-2 多線程
- 線程狀態
- 鎖與阻塞
- 悲觀鎖與樂觀鎖
- 阻塞隊列
- ConcurrentHashMap
- 線程池
- 線程框架
- 徹底搞懂AQS
- 2-3 Spring框架基礎
- Spring注解
- Spring IoC 和 AOP 的理解
- Spring工作原理
- 2-4 集合框架
- 死磕HashMap
- 第三部分 高級編程
- Socket與NIO
- 緩沖區
- Bybuffer
- BIO、NIO、AIO
- Netty的工作原理
- Netty高性能原因
- Rabbitmq
- mq消息可靠性是怎么保障的?
- 認證授權
- 第四部分 數據存儲
- 第1章 mysql篇
- MySQL主從一致性
- Mysql的數據組織方式
- Mysql性能優化
- 數據庫中的樂觀鎖與悲觀鎖
- 深度分頁
- 從一條SQL語句看Mysql的工作流程
- 第2章 Redis
- Redis緩存
- redis key過期策略
- 數據持久化
- 基于Redis分布式鎖的實現
- Redis高可用
- 第3章 Elasticsearch
- 全文查詢為什么快
- battle with mysql
- 第五部分 數據結構與算法
- 常見算法題
- 基于數組實現的一個隊列
- 第六部分 真實面試案例
- 初級開發面試材料
- 答案部分
- 現場編碼
- 第七部分 面試官角度
- 第八部分 計算機基礎
- 第九部分 微服務
- OpenFeign工作原理