这里主要指mysql与redis的数据一致性问题。
1.先更新数据库,再更新缓存
很少使用,存在并发更新问题:
有两个线程:线程A、线程B
A更新数据库 → B更新数据库 → B更新缓存 → A更新缓存
后果:存入脏数据
2.先删除缓存,再更新数据库
有的缓存可能是数据的聚合,有多张表作为数据源,伴随多个数据源的变动,可能会频繁更新缓存,该场景适合先删缓存。
使用较多,可能出现脏数据:
- A删除缓存 → B缓存未命中,从数据库获取 → B存入缓存 → A更新数据库
- 使用双删:A删除缓存 → A更新数据库 → 等待一段时间,A删除缓存
- 延迟删除导致性能不高,可以使用消息队列(缺点是可能产生消息堆积),删除失败则重试
3.先更新数据库,再删除缓存
订阅mysql的binlog,异步的更新缓存,有一些binlog同步组件,如领英的databus,阿里巴巴的canal,美团点评的puma。