背景
Redis很多时候都是在使用内存,数据一直写,但内存是有限的,如果Redis内存满了,那么我们的很多缓存操作都会超时、失败,接着可能会引发雪崩。那么当内存达到阀值Redis是怎么处理的呢?
配置内存限制maxmemory
我们可以通过在配置文件中配置maxmemory来限制内存的最大使用情况。如果maxmemory为0则表示无限制。 在redis.cn中配置如下配置:
maxmemory 1000mb //配置内存限制为1G
默认的当内存达到我们配置的指定大小时会返回错误,异常为OOM异常
,即已经没有足够的内存供试用。这是因为默认情况下Redis是不选择任何内存回收策略的。
配置内存回收策略
当内存达到最大限制时触发内存回收策略。我们可以通过maxmemory-policy
来指定内存回收策略。 例如:maxmemory-policy volatile-ttl
Redis内置的策略种类
noeviction: 禁止驱逐数据(默认);当内存达到限制时并且客户端尝试执行一些消耗内存的命令时返回错误,即OOM异常。 **allkeys-lru:**尝试回收最少使用的键 **volatile-lru:**尝试回收最少使用的键,但仅限于在已设置过期集合的键。 allkeys-random: 回收随机的键 **volatile-random:**回收随机的键,仅限于在已设置过期集合的键。 **volatile-ttl:**回收过期集合的键,并且优先回收存活时间较短的键,使得新添加的数据有地方可存放。
4.x引入的策略
从redis4.0开始引入了一个新的策略模式:LFU全称:Least Frequently Used。即最近很少使用。 两种策略:volatile-lfu
和allkeys-lfu
。
volatile-lfu: 在已设置过期的数据集中选择最不常使用的数据淘汰 allkeys-lfu: 从数据集中挑选最近最不常使用的数据淘汰。
回收进程如何工作
当客户端运行了一个新的命令,添加了新的数据 Redis检查内存使用情况 ,如果大于maxmemory的限制,则根据设定好的策略进行回收 新的命令被执行。。。