如何保证缓存与数据库双写时的数据一致性?
如何保证缓存与数据库双写时的数据一致性?
第1级:订单数据和支付流水数据;这两块数据对实时性和精确性要求很高,所以不添加任何缓存,读写操作将直接操作数据库。 第2级:用户相关数据;这些数据和用户相关,具有读多写少的特征,所以我们使用redis进行缓存。 第3级:支付配置信息;这些数据和用户无关,具有数据量小,频繁读,几乎不修改的特征,所以我们使用本地内存进行缓存。
但是只要使用到缓存,无论是本地内存做缓存还是使用 redis 做缓存,那么就会存在数据同步的问题,因为配置信息缓存在内存中,而内存时无法感知到数据在数据库的修改。这样就会造成数据库中的数据与缓存中数据不一致的问题。接下来就讨论一下关于保证缓存和数据库双写时的数据一致性。
解决方案
那么我们这里列出来所有策略,并且讨论他们优劣性。
先更新数据库,后更新缓存
先更新数据库,后删除缓存
先更新缓存,后更新数据库
先删除缓存,后更新数据库
先更新数据库,后更新缓存
先更新缓存,后更新数据库
这一种情况应该不需要我们考虑了吧,和第一种情况是一样的。
先删除缓存,后更新数据库
该方案也会出问题,具体出现的原因如下。
请求 A 会先删除 Redis 中的数据,然后去数据库进行更新操作 此时请求 B 看到 Redis 中的数据时空的,会去数据库中查询该值,补录到 Redis 中 但是此时请求 A 并没有更新成功,或者事务还未提交
请求 A 更新操作,删除了 Redis 请求主库进行更新操作,主库与从库进行同步数据的操作 请 B 查询操作,发现 Redis 中没有数据 去从库中拿去数据 此时同步数据还未完成,拿到的数据是旧数据
先更新数据库,后删除缓存
请求 A 先对数据库进行更新操作 在对 Redis 进行删除操作的时候发现报错,删除失败 此时将Redis 的 key 作为消息体发送到消息队列中 系统接收到消息队列发送的消息后再次对 Redis 进行删除操作
总结
正文结束
2.深圳一普通中学老师工资单曝光,秒杀程序员,网友:敢问是哪个学校毕业的?
3.从零开始搭建创业公司后台技术栈
4.程序员一般可以从什么平台接私活?
5.清华大学:2021 元宇宙研究报告!
6.为什么国内 996 干不过国外的 955呢?
7.这封“领导痛批95后下属”的邮件,句句扎心!
8.15张图看懂瞎忙和高效的区别!
评论