~卑微的搬砖人~ 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日

悬赏问题

  • ¥15 爬取网页内容并保存需要完整的python代码
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?
  • ¥15 铜与钢双金属板叠加在一起每种材料300mm长,18mm宽,4mm厚一端固定并加热至80℃,当加热端温度保持不变时另一端的稳态温度。ansys
  • ¥15 django5安装失败
  • ¥15 Java与Hbase相关问题
  • ¥15 后缀 crn 游戏文件提取资源
  • ¥15 ANSYS分析简单钎焊问题
  • ¥20 bash代码推送不上去 git fetch origin master #失败了