redis缓存一致性

这里主要指mysql与redis的数据一致性问题。

1.先更新数据库,再更新缓存

很少使用,存在并发更新问题:

  • 有两个线程:线程A、线程B

  • A更新数据库 → B更新数据库 → B更新缓存 → A更新缓存

  • 后果:存入脏数据

2.先删除缓存,再更新数据库

有的缓存可能是数据的聚合,有多张表作为数据源,伴随多个数据源的变动,可能会频繁更新缓存,该场景适合先删缓存。

使用较多,可能出现脏数据:

  • A删除缓存 → B缓存未命中,从数据库获取 → B存入缓存 → A更新数据库
  • 使用双删:A删除缓存 → A更新数据库 → 等待一段时间,A删除缓存
  • 延迟删除导致性能不高,可以使用消息队列(缺点是可能产生消息堆积),删除失败则重试

3.先更新数据库,再删除缓存

订阅mysql的binlog,异步的更新缓存,有一些binlog同步组件,如领英的databus,阿里巴巴的canal,美团点评的puma。