Redis内存淘汰指的是当缓存内存不够用的清情况下,用户存储的一些键被可以被Redis主动地从实例中删除。内存的淘汰机制的初衷是为了更好地使用内存,用一定的缓存miss来换取内存的使用效率。
首先缓存都有哪些清空策略?
场景的缓存清空策略一般有:
-
FIFO(first in first out)
先进先出策略,最先进入缓存的数据在缓存空间不够的情况下会被优 先被清除掉。在数据实效性要求场景下可选择该类策略,优先保障最新数据可用。 -
LFU(less frequently used)
最少使用策略,无论是否过期,根据元素的被使用次数判断,清除使用次数较少的元素释放空间。在保证高频数据有效性场景下,可选择这类策略。 -
LRU(least recently used)
最近最少使用策略,无论是否过期,根据元素最后一次被使用的时间戳,清除最远使用时间戳的元素。在热点数据场景下较适用,优先保证热点数据的有效性。
除此之外,还有一些简单的策略
- 根据过期时间判断,清理过期时间最长的元素;
- 根据过期时间判断,清理最近要过期的元素;
- 随机清理;
如何使用redis这个特性呢?
可以通过修改redis.conf中的配置文件来开启这个功能,值得说明的是当bytes大小为0时表示,我们对Redis的内存使用没有限制。
maxmemory <bytes>
redis提供了6种淘汰策略,默认是noeviction
策略,这些策略分别是:
noeviction
:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。allkeys-lru
:在主键空间中,优先移除最近未使用的key。volatile-lru
:在设置了过期时间的键空间中,优先移除最近未使用的key。allkeys-random
:在主键空间中,随机移除某个key。volatile-random
:在设置了过期时间的键空间中,随机移除某个key。volatile-ttl
:在设置了过期时间的键空间中,具有更早过期时间的key优先移除
可以通过如下的配置来设置指定的策略
maxmemory-policy noeviction
redis这些淘汰策略的使用场景
allkeys-lru
如果我们的应用对缓存的访问符合幂律分布(也就是存在相对热点数据),或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择allkeys-lru策略。allkeys-random
如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。volatile-ttl
这种策略使得我们可以向Redis提示哪些key更适合被删除。
另外,volatile-lru
策略和volatile-random
策略适合我们将一个Redis实例既应用于缓存和又应用于持久化存储的时候,然而我们也可以通过使用两个Redis实例来达到相同的效果,值得一提的是将key设置过期时间实际上会消耗更多的内存,因此我们建议使用allkeys-lru策略从而更有效率的使用内存。