~卑微的搬砖人~ 2023-04-13 16:10 采纳率: 100%
浏览 39
已结题

如何保证缓存与数据库双写时的数据一致性?

在做系统优化时,想到了将数据进行分级存储的思路。因为在系统中会存在一些数据,有些数据的实时性要求不高,比如一些配置信息。基本上配置了很久才会变一次。而有一些数据实时性要求非常高,比如订单和流水的数据。所以这里根据数据要求实时性不同将数据分为三级。

第1级:订单数据和支付流水数据;这两块数据对实时性和精确性要求很高,所以不添加任何缓存,读写操作将直接操作数据库。

第2级:用户相关数据;这些数据和用户相关,具有读多写少的特征,所以我们使用redis进行缓存。

第3级:支付配置信息;这些数据和用户无关,具有数据量小,频繁读,几乎不修改的特征,所以我们使用本地内存进行缓存。

但是只要使用到缓存,无论是本地内存做缓存还是使用 redis 做缓存,那么就会存在数据同步的问题,因为配置信息缓存在内存中,而内存时无法感知到数据在数据库的修改。这样就会造成数据库中的数据与缓存中数据不一致的问题。怎样保证缓存和数据库双写时的数据一致性。有什么好的解决方案吗。

  • 写回答

2条回答 默认 最新

  • Tomshidi 2023-04-13 16:17
    关注

    老生常谈的问题了,只要是用到缓存就会有一致性问题。方案有以下几种:

    1. 先删除缓存,再写入数据库。这种方案实现简单,但在高并发下仍然有不一致的问题。如果业务能容忍一定时间的不一致,可以减少缓存有效期缓解不一致。
    2. 延迟双删。先删除缓存,再写入数据库,最后延迟一定时间(比如1秒)再次删除缓存。这就可以避免方案一的问题。但该方案与方案一都需要考虑删除失败的场景。
    3. 使用canal监听数据库binlog变更,有变更时就去缓存里将旧缓存删除掉。这种方案最保险,但要引入第三方中间件,会增加项目技术复杂度。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    1人已打赏
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月27日
  • 已采纳回答 6月19日
  • 创建了问题 4月13日

悬赏问题

  • ¥25 LT码在高斯信道下的误码率仿真
  • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作
  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强
  • ¥15 心碎了,为啥我的神经网络训练的时候第二个批次反向传播会报错呀,第一个批次都没有问题
  • ¥15 MSR2680-XS路由器频繁卡顿问题
  • ¥15 VB6可以成功读取的文件,用C#读不了