Redis总结(4)——Redis的过期策略,内存淘汰策略

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaojie_570/article/details/87271840

一、几个问题

【问题一】 我往 redis 里写的数据怎么没有了?
【问题二】 我的数据明明都过期了,怎么还占用内存啊?

二、Redis 过期策略

我们在 set key 的时候,可以设置这个 key 的过期时间,即:expire time。指定这个 key 比如说只能存活1个小时?10分钟?我们可以自己指定缓存到期就失效。

如果假设你设置一批 key 只能存活1个小时,那么接下来 1 小时后,redis 是怎么对这批 key 进行删除的?

答案是:定期删除 + 惰性删除

2.1 定期删除

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

2.2 惰性删除

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

并不是key 到时间就被删除掉,而是你查询这个key的时候,redis 再懒惰的检查一下。

通过上述两种手段结合起来,保证过期的 key 一定会被干掉。

实际上还有一个问题,如果定期删除漏掉了很多过期的key,然后你也没有及时去查,也就没有走惰性删除,此时会怎么样呢?如果大量过期的key 堆积在内存中,导致 redis 内存块耗尽了,怎么办?

答案是:走内存淘汰机制

三、内存淘汰机制

  • 【noeviction】

    • 当内存不足以容纳新写入的数据时,新写入操作会报错,这个一般没人使用。
  • 【allkeys-lru】

    • 当内存不足以容纳新写入的数据时,在键空间中,移除最近最少使用的key
  • 【allkeys-random】

    • 当内存不足以容纳新写入的数据时,在键空间中,随机移除某个key,这个一般没有人使用
  • 【volatile-lru】

    • 当内存不足以容纳新写入的数据时,在设置了过期时间的键空间中,移除最近最少使用的键
  • 【volatile-random】

    • 当内存不足以容纳新写入的数据时,在设置了过期时间的键空间中,随机移除某个键
  • 【volatile-ttl】

    • 当内存不足以容纳新写入的数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除

猜你喜欢

转载自blog.csdn.net/xiaojie_570/article/details/87271840
今日推荐