Skip to content

过期策略

在 Redis 中设置了过期时间的 key,在一定时间后都会被删除。

键的过期时间

配置过期时间

  1. setex key seconds value

    设置 key 时添加过期时间

  2. expire key seconds

    为某个 key 设置过期时间。

  3. 删除 key 的过期时间。

    persist key

  4. 查看 key 的过期时间

    ttl key

redis保存过期时间分析

版权声明:本文为CSDN博主「梦里寻乡」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/jiangchunhui2009/article/details/81504073

三种过期策略

  1. 定时删除

    • 含义

      设置 key 过期时间时,为 key 创建一个定时器,当这个 key 到达过期时间时,定时器会将其删除。

    • 优点

      保证过期的 key 能够及时被删除,释放内存空间。(以时间换空间)

    • 缺点

      • 由于每个设置了过期时间的 key 都有一个定时器,会严重影响性能。
      • 定时器删除 key 的操作会占用 CPU 资源,在高并发情况下影响 CPU 性能。
  2. 惰性删除

    • 含义

      在 key 过期的时候不会主动删除,而是在使用 key 的时候,先检查 key 是否过期,若过期,则删除这个 key 并返回 null。

    • 优点

      key 过期后只有在再次使用的时候才会将其删除,大大减小了 CPU 资源的使用。(以空间换时间)

    • 缺点

      若大量的 key 过期之后,若很长时间不使用,则 key 在内存中无法被删除,容易造成内存泄露。

  3. 定期删除

    • 含义

      每隔一段时间主动执行删除过期 key 的操作。

    • 优点

      • 定期删除过期 key,能保证内存泄露不会发生,解决了惰性删除的缺点。(时间和空间的折中)
      • 通过定期来限制删除过期 key 的频率和时长,来减少 CPU 资源的使用。
    • 缺点

      • 在 CPU 时间优化,不如惰性删除。
      • 在内存空间优化上,不如定时删除。
    • 难点

      • 合理的设置定期删除的执行时间和执行频率

redis采用的过期策略

redis 采用的是 定期删除 + 惰性删除

redis 的定期删除

redis会将每个设置了过期时间的 key 放入独立的字典中,默认每隔 100 ms 进行一次扫描(1s 中执行 10 次),每次扫描的任务时间是 25ms 。

  1. 遍历每个数据库(redis 默认数据库 16 个)。
  2. 从数据库随机抽取 20 个 key。
  3. 删除这 20 个 key 中过期的 key。
  4. 如果过期的 key 存在比例超过 1/4,重复步骤。
  5. 判断定期删除操作是否达到指定的操作时长,若达到,退出定期删除。

redis 的惰性删除

  • 在进行 get 或者 setnx 等操作时,会先检查 key 是否过期。
  • 若过期,先删除 key ,再执行相应操作。
  • 若未过期,执行相应操作。

RDB 对过期 key 的处理

  • 从 内存 -> RDB 文件

    持久化 key 之前,会判断 key 是否过期,过期的 key 不存入 RDB 文件。

  • 从 RDB 文件 -> 内存

    数据存入内存数据库之前,会检查 key 是否过期,若过期,不导入内存数据库。(主库情况)

AOF 对过期 key 的处理

  • 从内存 -> AOF 文件
    • 当 key 过期后,还没被删除的话,此时进行执行持久化操作(该 key 没有 aof 文件,因为没有发生修改)。
    • 当 key 过期后,在发生删除时,程序会向 AOF 文件追加一条 del 命令(在将来从 AOF 文件恢复数据时该过期键会被删除)。
  • AOF 文件重写
    • 重写时,会先判断 key 是否过期,已过期的 key 不会重写到 AOF 文件。