redis缓存和数据库一致性问题

356 阅读2分钟

概述

缓存和数据库一致性问题,其实说的就是说数据库变动的同时,缓存没有变化,这样导致用户获取到的数据命中缓存,并没有获取到数据库最新数据. 使用缓存是一种加快访问速度的方案,但是同时带来数据不一致问题.根本不一致原因,其实是因为数据库和redis属于两个RPC操作,不在一个事务,导致数据不一致.

数据不一致问题分析

1.先删缓存,再更新数据库(操作都成功)
 a.A线程做业务,先删除缓存
 b.B在A线程,更新数据库之前查询,获取到更新前数据
 c.A线程更新数据库
 
总结:
 a.一般情况下,造成数据不一致,都是因为高并发,在两个操作之间有流量访问
 b.一般只影响显示,真实发生数据库写操作,还是使用的更新后的数据
 c.一般这种情况还是建议一个缓存设置超时时间


2.先删缓存,再更新数据库(删除缓存成功,更新数据库失败)
 a.A线程做业务,先删除缓存
 b.A线程更新数据库失败
 c.B线程重新获取数据库值,并且加载到缓存
 
总结:不涉及数据不一致问题,只是触发了一次数据库查询,误删缓存

3.先更新数据库,再删除缓存(删除缓存成功,更新数据库失败)
 a.A线程做业务,先更新数据库
 b.A线程删除缓存失败
 c.B线程还是访问缓存命中
 
总结:
 a.有数据一致性问题,缓存没有被刷新
 b.不影响实际业务,只是显示有误,数据库读写还是使用真实数据
 c.可以通过设置缓存超时时间来解决
 d.可以使用事务,缓存删除失败抛出异常进行回滚(不建议因为缓存一致性牺牲业务)

解决方案

1.综合上述三种情况,其实只要设置缓存过期时间就能解决了,最终都能达到数据最终一致
2.在数据库更新情况下还是要连带删除缓存,可以减少数据不一致时间段