Redis内存淘汰策略
Nov 25, 2018
当Redis被用作缓存的时候,当往Redis中添加新的数据,但是内存不足时,使用lru测试自动清除老的数据, 这几乎是所有缓存应用的默认特性. 事实上,LRU只是redis支持的淘汰策略的其中一种
Maxmemory configuration directive
maxmemory 100mb
maxmemory用于配置redis使用的最大内存.将maxmemory设置为零会导致无内存限制,这是64位系统的默认行为,而32位系统则使用3GB的隐式内存限制.
当内存占用满时,Redis会根据不同的配置执行不同的淘汰策略,这时Redis可能会只返回会导致内存增长的命令的执行错误或者淘汰一些旧数据来添加新的数据.
淘汰策略
使用maxmemory-policy
来配置淘汰策略, redis的策略有以下几种:
- noeviction 禁止驱逐数据
- allkeys-lru 从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
- volatile-lru 从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用 的数据淘汰
- allkeys-random 从数据集(server.db[i].dict)中任意选择数据淘汰
- volatile-random 从已设置过期时间的数据集(server.db[i].expires)中任意选择数据 淘汰
- volatile-ttl 从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数 据淘汰
Approximated LRU algorithm
redis使用的不是真正的lru算法。它使用的是近似的lru算法,通过抽样少量的keys,然后根据lru算法删除其中某个key。因此redis根据lru算法清除的key不一定是整个实例中”最近最少使用的”,而只是抽样中最近最少使用的.
redis 3.0开始redis的lru算法已经被改进了,提高了性能,更接近于真正的lru算法了。
新的LFU模式
从Redis 4.0开始,可以使用新的最少使用的逐出模式。在某些情况下,这种模式可能效果更好(提供更好的命中/未命中率),因为使用LFU Redis将尝试追踪数据的访问频率,以便很少使用的数据被驱逐,而使用的数据往往有更高的机会被保留.
在LRU中,有些数据可能从未被访问,但由于随机性可能依然不会被清除.新的LFU将不会存在这个问题, 而且通常情况下可以适应不同的访问模式.
LFU的配置有以下两种:
- volatile-lfu
- allkeys-lfu