如何保证数据库、缓存的双写一致?

前言

在我们日常研发过程中,由于数据库的一些限制,我们经常使用缓存(如:Redis)来提升访问速率。此时,数据库和缓存双写数据就存在一致性问题,这个问题跟开发语言无关,在高并发场景下,问题更加严重。
另外,在面试、工作中也会经常遇到这个问题。所以这里跟大家一起探讨下数据库和缓存双写一致性问题的解决文案。

常见方案

通常,我们使用缓存的主要目的就是为了提升查询性能。所以,我们一般这样使用缓存:

用户请求
查询缓存
是否存在?
返回
查询数据库
是否存在?
放入缓存
  1. 用户请求数据,先查询缓存中是否有相关数据,如果有则直接返回
  2. 如果缓存没数据,再继续查询数据库
  3. 如果数据库有相关数据,则将查询出来的数据放入缓存中,然后返回该数据
  4. 如果数据库也没数据,则直接返回空

这是缓存的常见用法,粗看之下,好像没啥问题。但这个方案忽略了一个非常重要的细节:如果数据库中的某条数据放入缓存后又立即更新了,那么如何更新缓存呢?
答案是:在很长的一段时间内(取决于缓存的过期时间),用户请求从缓存中取到的数据都可能是旧值,而非数据库的最新值。

更新缓存的方案

那该如何主动更新缓存呢?有以下四种方案:

  • 先写缓存,再写数据库
  • 先写数据库,再写缓存
  • 先删缓存,再写数据库
  • 先写数据库,再删缓存
    接下来,我们分别探讨下这四种方案

1. 先写缓存,再写数据库

很多人第一想法是在写操作中直接更新缓存(写缓存),直接明了。那么问题是:在写操作中,先写缓存,还是先写数据库呢?

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值