Redis的 过期策略 和 淘汰策略

过期策略

  • 定时过期(主动淘汰),
    • Redis未使用
    • 每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除
    • 可以立即清除过期的数据,对内存很友好
    • 但是会占用大量的CPU资源去处理过期的数据,影响缓存的响应时间和吞吐量
  • 惰性过期(被动淘汰)
    • 只有当访问一个key时,才会判断该key是否已过期,过期则清除
    • 可以最大化地节省CPU资源,却对内存非常不友好,极端情况可能有大量过期key没有再次被访问,从而不会被清除,占用大量内存
  • 定期过期
    • 每隔一定时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key
    • 该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果

Redis 中同时使用了惰性过期和定期过期两种过期策略

Redis中定期过期策略算法大致实现

  1. redis.config中hz定义了serverCron任务的执行周期,默认为10,即CPU空闲时每秒执行10次
  2. 每次过期key清理的时间不超过CPU时间的25%,即若hz=1,则一次清理时间最大为250ms,若hz=10,则一次清理时间最大为25ms
  3. 清理时依次遍历所有的db
  4. 从db中随机取20个key,判断是否过期,若过期,则逐出
  5. 若有5个以上key过期,则重复步骤4,否则遍历下一个db
  6. 在清理过程中,若达到了25%CPU时间,退出清理过程

淘汰策略

淘汰策略 含义
volatile-lru 根据 LRU 算法删除设置了超时属性(expire)的键,直到腾出足够内存为止。如果没有可删除的键对象,回退到 noeviction 策略。
allkeys-lru 根据 LRU 算法删除键,不管数据有没有设置超时属性,直到腾出足够内存为止。
volatile-lfu 在带有过期时间的键中选择最不常用的。
allkeys-lfu 在所有的键中选择最不常用的,不管数据有没有设置超时属性。
volatile-random 在带有过期时间的键中随机选择。
allkeys-random 随机删除所有键,直到腾出足够内存为止。
volatile-ttl 根据键值对象的 ttl 属性,删除最近将要过期数据。如果没有,回退到 noeviction 策略。
noeviction 默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信息(error)OOMcommand not allowed when used memory,此时 Redis 只响应读操作

建议使用 volatile-lru,在保证正常服务的情况下,优先删除最近最少使用的 key

在 redis.conf 中 # maxmemory-policy noeviction 配置淘汰策略

你可能感兴趣的:(Redis的 过期策略 和 淘汰策略)