redis缓存过期策略与内存淘汰机制
- redis缓存过期策略
- redis内存淘汰机制
- 开启内存淘汰机制
- 如何选择淘汰策略
redis缓存过期策略
在设置了expire的key缓存过期了,但是服务器的内存还是被占用,不会被立即被释放,这是因为redis所基于的两种删除策略。
- (主动)定时删除
定时随机的检查过期的KEY,如果过期则清理删除,释放被占用的内存。(每秒检查的次数在redis.cof中的hz配置) - (被动)惰性删除
当客户端请求一个已经过期的key的时候,那么reids会检查这个key是否过期,如果过期了,则删除,然后返回一个null。这种策略对CPU比较友好,不会有太多的损耗,但是内存占用会比较高。虽然key过期了,但是只要没有被redis清理,那么其实内存还是会被占用。
redis内存淘汰机制
结合定期删除+惰性删除 Redis 实现了key的过期时间机制,但还是会有一些key会没有被定期删除掉,也没有被查询,就遗留在了内存中,当数据量大到一定程度后,会导致内存的堆积。这就涉及到了内存淘汰机制。
- volatile-lru -> 在设置了expire过期的缓存中,清除最少使用的旧缓存,然后保存新的缓存
- allkeys-lru -> 清除最近最少使用的数据,基于访问时间(推荐使用)
- volatile-lfu -> 在设置了expire过期的缓存中,清除最近最少使用的数据,基于访问时间
- allkeys-lfu ->清除最不经常使用的数据,基于访问次数
- volatile-random -> 在设置了expire过期的缓存中,清除最不经常使用的数据,基于访问次数
- allkeys-random ->随机删除一些缓存
- volatile-ttl -> 在那些设置了expire过期时间的缓存中,根据过期时间的先后顺序进行删除
- noeviction -> 旧缓存永不过期,新缓存设置不了,返回错误
备注:
LRU(Least Recently Used) : 淘汰最近最少使用的数据,基于访问时间;
LFU(Least Frequently Used): 淘汰最不经常使用的数据,基于访问次数;
开启内存淘汰机制
在redis.conf中
- 配置 maxmemory ,设置Redis的最大内存空间,当内存已使用率到达,则开始清理缓存;
- 配置maxmemory-policy noeviction,设置淘汰策略,默认为 noeviction;
如何选择淘汰策略
- allkeys-lru 和 allkeys-lfu 适用于存在热点数据的情况。明确有一部分数据访问频率较高,其余数据访问频率较低或者无法预测使用频率。
- allkeys-random 适用于所有数据访问概率大致相等。
- volatile-ttl 根据过期时间的先后顺序进行删除。
- volatile-lru ,volatile-lru 和volatile-random 适用于希望一些数据能被保存,则可以从设置了过期时间的数据中进行删除。
- 至于LRU与LFU的选择,则需要根据业务权衡到底是选择 淘汰最近最少使用(LRU) 还是选择最不经常使用(LFU)。
总的来说,无论是 LRU LFU TTL 还是Random 都是几近算法来实现的,在可靠性和性能上做了一定的平衡。还是应该在业务中主动删除没有价值的数据,或者更新某些key的过期时间等来提高Redis的性能和空间,不能过分依赖于淘汰策略。