1. 过期键删除机制
Redis使用的过期键删除机制是:惰性删除
+定期删除
;
惰性删除
- 策略:每次从键空间获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键;
- 惰性删除的优点:CPU友好,不会占用太多CPU时间;
- 惰性删除的缺点:内存不友好,浪费内存空间,有内存泄露的危险:
- 如果数据库中有非常多的过期键,而这些过期的键又恰好没有被访问到的话,那么它们将永远不会被删除(除非手动执行flushdb),这样有可能导致
内存泄露
; 内存泄露
:无用的垃圾数据占用了大量的内存,而服务器却不会去释放它们;
- 如果数据库中有非常多的过期键,而这些过期的键又恰好没有被访问到的话,那么它们将永远不会被删除(除非手动执行flushdb),这样有可能导致
定期删除
- 策略:每隔一段时间,程序就对数据库进行一次检查,删除里面过期的键;
- Redis的定期删除:在规定的时间内分多次遍历服务器中的各个数据库,从数据库的
expires
字典中随机检查一部分键的过期时间,并删除其他的过期键;
2. 内存淘汰策略
- 如果redis达到最大使用内存时,会进行内存淘汰。
- 最大内存设置参数:
maxmemory <bytes>
内存淘汰策略有:
- LRU: 淘汰最久未使用的键值对
volatile-lru
:在设置了过期时间的key中淘汰最长时间未使用的 ;allkeys-lru
:在全部key中淘汰最长时间未使用的;
- LFU: 淘汰最近最少使用的键值对
volatile-lfu
:在设置了过期时间的key中淘汰最近最少使用的;allkeys-lfu
:在全部key中淘汰最近最少使用的;
- Random: 随机淘汰键值对
volatile-random
:在设置了过期时间的key中随机删除;allkeys-random
:在全部key中随机删除;
- TTL:删除最早过期的键值对
volatile-ttl
:在设置了过期时间的key中删除最早过期的;
- NO:不淘汰键值对,拒绝新写入操作
noevication
:不删除key,对新的写操作返回一个错误;
备注:LRU与LFU
# LRU means Least Recently Used 最久未使用
# LFU means Least Frequently Used 最近最少使用