缓存和数据库的数据不一致的产生原因
数据一致性
- 缓存中有数据,那么,缓存中的数据值需要和数据库中的值相同
- 缓存中没有数据,那么,数据库中的值必须是最新值
Redis缓存类型
- 读写缓存
- 只读缓存
读写缓存
数据的增删改,同步策略
- 同步直写策略:写缓存时,同步写数据库
- 异步回写策略:写缓存时不同步回写数据库;等到数据从缓存中淘汰时,再写回数据库。
想要保持一致性,使用 同步直写 策略;同时开启事务机制保持保证原子性
只读缓存
新增数据(天然一致)
- 数据写数据库,缓存不操作;查询时缓存从数据库加载
删改数据
- 问题一:先删除缓存,再更新数据库值:如果数据库更新失败,导致查询时,缓存同步回数据库旧值
- 问题二:先更新数据库值,再删除缓存:如果缓存删除失败,导致查询时,查询到旧值
解决方法
操作失败 使用消息队列重试机制
并发问题: 导致读取到更新之前的值
- 采用延迟双删,即更新完数据库以后再删除一次缓存
- 等待缓存删除完成,期间会有不一致数据短暂存在
建议方案
- 优先使用先更新数据库再删除缓存的方法:考虑缓存穿透和延迟双删等待时间不好预估
- 先更新数据库再删除缓存,建议先在Redis缓存客户端暂存并发读请求,等操作完成后,再读取数据,从而保持数据一致性
网友评论