缓存中的数据通常都是有生命周期的,需要在指定时间后被删除或更 新,这样可以保证缓存空间在一个可控的范围。但是缓存中的数据会和数据源中的真实数据有一段时间窗口的不一致,需要利用某些策略进行更新。下面介绍 Redis 常用的三种缓存更新策略。

LRU/LFU/FIFO 算法剔除

剔除算法通常用于缓存使用量超过了预设的最大值的时候,如何对现有的数据进行剔除,例如使用 maxmemory-policy 这个配置作为内存最大值后对于数据的剔除策略。

超时删除

超时剔除通过给缓存数据设置过期时间,让其在过期时间后自动删除,例如 Redis 提供的 expire 命令。如果业务可以容忍一段时间内,缓存层数据和存储层数据不一致,那么可以为其设置过期时间。在数据过期后,再从真实数据源获取数据,重新放到缓存并设置过期时间。

主动更新

应用方对于数据的一致性要求高,需要在真实数据更新后,立即更新缓存数据。例如可以利用消息系统或者其他方式通知缓存更新。

更新策略对比

Redis更新策略 - 图1
从上面的横向对比数据,可以得出如下建议配置:

  • 低一致性业务建议配置最大内存和淘汰策略的方式
  • 高一致性业务可以结合使用超时剔除和主动更新,这样即使主动更新出了问题,也能保证数据过期时间后删除脏数据