1. 删除策略
1.1. 立即删除(过期后立即删除)
原理:key 过期之后立即删除
缺点:对CPU不友好,用处理器性能换取存储空间(拿时间换空间),存在大量 key 同时过期占用大量 CPU 资源进行删除操作的情况
1.2. 惰性删除
原理:过期后先不删除,等下一次访问时判断是否过期,若过期则立即删除
缺点:对CPU不友好,用处理器性能换取存储空间(拿时间换空间),存在长时间未访问的过期 key 大量堆积占用内存的情况
配置:在 redis.conf 通过设置 lazyfree-lazy-eviction:yes
进行开启
1.3. 定期删除
原理:每隔一段时间执行一次删除过期键操作并通过限制删除操作执行时长和频率来减少删除操作对CPU时间的影响。
缺点:定期删除的抽样是随机抽样的,会出现过期 key 多次未被抽样到的情况
注意:定期删除策略的难点是确定删除操作执行的时长和频率:如果删除操作执行得太频繁或者执行的时间太长,定期删除策略就会退化成立即删除策略,以至于将CPU时间过多地消耗在删除过期键上面。如果删除操作执行得太少,或者执行的时间太短,定期删除策略又会和惰性删除束略一样,出现浪费内存的情况。因此,如果采用定期删除策略的话,服务器必须根据情况,合理地设置删除操作的执行时长和执行频率。
2. 淘汰策略
2.1. LFU
含义: Least Frequently Used,最近最少使用页面置换算法,淘汰最长时间未被使用的页面,看页面最后一次被使用到发生调度的时间长短,首先淘汰最长时间未被使用的页面。
2.2. LRU
含义:Least Recently Used,最近最不常用页面置换算法,淘汰一定时期内被访问次数最少的页,看一定时间段内页面被使用的频率,淘汰一定时期内被访问次数最少的页
2.3. LRU和LFU的区别
LRU和LFU是不同的!
LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面!
LFU是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页!
比如,第二种方法的时期T为10分钟,如果每分钟进行一次调页,主存块为3,若所需页面走向为2 1 2 1 2 3 4
注意,当调页面4时会发生缺页中断
若按LRU算法,应换页面1(1页面最久未被使用) 但按LFU算法应换页面3(十分钟内,页面3只使用了一次)
可见LRU关键是看页面最后一次被使用到发生调度的时间长短,
而LFU关键是看一定时间段内页面被使用的频率!
2.4. 如何选择淘汰策略
- 在所有的 key 都是最近最经常使用,那么就需要选择 allkeys-lru 进行置换最近最不经常使用的key,如果你不确定使用哪种策略,那么推荐使用 allkeys-lru
- 如果所有的 key 的访问概率都是差不多的,那么可以选用 allkeys-random 策略去置换数据
- 如果对数据有足够的了解,能够为 key 指定 hint (通过expire/ttl指定),那么可以选择 volatile-ttl 进行置换