数据一致性问题的解决:先更新数据库并删缓存,查询时再更新缓存
加缓存的问题
缓存的使用降低了后端负载,提高了读写的效率,降低了响应的时间。
但缓存带来问题,比如:数据一致性问题
数据一致性的产生原因
缓存和数据库中的数据不同步
所以需要缓存更新策略。
缓存更新策略
主动更新(手动)。手动编码实现缓存更新,在修改数据库的同时更新缓存
双写方案(Cache Aside Pattern):
人工编码方式,缓存调用者在更新完数据库后再去更新缓存。使用困难,灵活度高。
1)读取(Read):当需要读取数据时,首先检查缓存是否存在该数据。如果缓存中存在,直接返回缓存中的数据。如果缓存中不存在,则从底层数据存储(如数据库)中获取数据,并将数据存储到缓存中,以便以后的读取操作可以更快地访问该数据。
2)写入(Write):当进行数据写入操作时,首先更新底层数据存储中的数据。然后,根据具体情况,可以选择直接更新缓存中的数据(使缓存与底层数据存储保持同步),或者是简单地将缓存中与修改数据相关的条目标记为无效状态(缓存失效),以便下一次读取时重新加载最新数据
使用双写方案需要 使用删除缓存模式
删除缓存模式:
更新数据时更新数据库并删除缓存,查询时更新缓存,无效写操作较少(推荐使用)
选择使用删除缓存模式,先操作数据库?
先操作数据库
先操作数据库:先更新数据库,再删缓存
- 当线程1在查询缓存且未命中,此时线程1查询数据,查询完准备写入缓存时,
- 由于没有加锁线程2乘虚而入,线程2在这期间对数据库进行了更新,
- 此时线程1将旧数据返回了,出现了脏读。
这个事件发生的概率很低,因为先是需要满足缓存未命中,且在写入缓存的那段事件内有一个线程进行更新操作,缓存的查询很快,这段空隙时间很小,所以出现脏读现象的概率也很低
这种方式的不足之处:存在脏读现象,但概率较小
选择先更新数据库,再删除缓存。那么如何保证缓存与数据库的操作的原子性(同时成功或失败)?
数据库操作的原子性
对于单体系统1,将缓存与数据库操作放在同一个事务中(当前项目就是一个单体项目,所以选择这种方式)

浙公网安备 33010602011771号