• redis 使用惰性删除和定期删除

常见的删除策略

惰性删除

  • 当 key 过期时,不管他
  • 当客户端尝试访问 key 时,会判断该 key 是否过期,过期就删除该键
  • 特点
    • CPU友好,浪费内存空间
    • 如果 key 过期时,如果不被访问,会一致存在内存中

定时删除

  • 在设置过期时间时,创建一个定时器,在键的过期时间到来时,立即对键进行删除
  • 会有大量的定时器,性能浪费

**

定期删除

  • 在单位时间内,程序对内存中的数据进行检查,删除里面的过期 key
  • 单位时间太小,会占用 cpu,太大会浪费内存,由算法决定
  • 例子: 假设 Redis 每秒进行处理
    1. 测试随机的一些 key 进行过期检查,比如 1000 个key
    2. 删除上述 key 中过期的那部分
    3. 如果步骤 a 中的 key 有多余 25% 的过期,会重复步骤 a

删除策略

惰性删除策略

  • 操作 key 时,使用 expireIfNeeded 函数判断 key 是否过期

定期删除策略

  • serverCron 函数(redis 的定时函数) 执行时,调用 activeExpireCycle 函数
    • 在规定的时间里面分多次遍历服务器的 expires 字典随机检查一部分 key 的过期时间,并删除其中的过期 key