Redis 配置过期自动删除策略

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 配置过期自动删除策略相关的知识,希望对你有一定的参考价值。

参考技术A Redis操作是基于内存的,大小有限。当内存不足或占用过高时,需要自动放弃一些未到期的数据
Redis 默认 的生效的配置为 noeviction ,需要根据不同的业务选择不同的淘汰策略

volatile-lru:在设置过期时间的数据集合里淘汰最近访问最少的数据
allkeys-lru:所有数据集合中淘汰最近访问最少的数据
volatile-lfu:在设置过期时间的数据集合里淘汰访问频率最低的数据
allkeys-lfu:所有数据集合中淘汰访问频率最低的数据
volatile-random:在设置过期时间的数据集合里,随机淘汰
allkeys-random:在所有的数据集合随机淘汰
volatile-ttl:在设置过期时间的数据集合里,淘汰剩余存活时间 (TTL) 最少的数据
noevictionl:当内存不足以写入新数据时,拒绝新数据写入。Redis 默认策略

我这里越久的数据价值越低,不在乎调用次数。所以选择
volatile-ttl
找到配置 maxmemory-policy 默认被注释 生效策略 noevictionl

保存
重启redis 生效

Redis 过期策略 和 回收策略

参考技术A 惰性策略就是在客户端访问这个 key 的时候,redis 对 key 的过期时间进行检查,如果过期了就立即删除。

Redis 默认会每秒进行十次过期扫描,过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。
1.从过期字典中随机 20 个 key;
2.删除这 20 个 key 中已经过期的 key;
3.如果过期的 key 比率超过 1/4,那就重复步骤 1;
同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。

从库不会进行过期扫描,从库对过期的处理是被动的。主库在 key 到期时,会在 AOF 文件里增加一条 del 指令,同步到所有的从库,从库通过执行这条 del 指令来删除过期的 key。
因为指令同步是异步进行的,所以主库过期的 key 的 del 指令没有及时同步到从库的话,会出现主从数据的不一致

这是由 redis 的过期策略来决定。

redis 过期策略是: 定期删除+惰性删除 。
所谓定期删除,指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除。
假设 redis 里放了 10w 个 key,都设置了过期时间,你每隔几百毫秒,就检查 10w 个 key,那 redis 基本上就死了,cpu 负载会很高的,消耗在你的检查过期 key 上了。注意,这里可不是每隔 100ms 就遍历所有的设置过期时间的 key,那样就是一场性能上的灾难。实际上 redis 是每隔 100ms 随机抽取一些 key 来检查和删除的。

但是问题是,定期删除可能会导致很多过期 key 到了时间并没有被删除掉,那咋整呢?所以就是惰性删除了。这就是说,在你获取某个 key 的时候,redis 会检查一下 ,这个 key 如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。

但是实际上这还是有问题的,如果定期删除漏掉了很多过期 key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?如果大量过期 key 堆积在内存里,导致 redis 内存块耗尽了,咋整?
答案是:走内存淘汰机制。

以上是关于Redis 配置过期自动删除策略的主要内容,如果未能解决你的问题,请参考以下文章

Redis的过期删除策略

redis key过期提醒,实现订单自动取消

redis过期key的清理策略

redis的过期策略以及内存淘汰机制

Redis中的LRU淘汰策略分析

Redis过期键删除策略和内存淘汰策略