首页 > 数据库 >缓存数据库双写不一致

缓存数据库双写不一致

时间:2024-01-10 10:15:15浏览次数:24  
标签:缓存 数据库 Redis 更新 Mysql 操作 双写

缓存数据库双写不一致

Redis 缓存与数据库 Mysql 双写不一致如何解决?方案2应该是最好的,也是最复杂的。其他都有很明显的问题。

  1. 对于频繁更新的数据不建议加缓存

  2. 异步更新缓存(基于订阅 binlog 的同步机制):binlog 增量订阅消费 + 消息队列 + 增量数据更新到 redis

    1. 读 Redis:热数据基本都在 Redis
    2. 写 Mysql:增删改都在数据库;
    3. 更新 redis 数据:数据库的操作是 binlog,来更新到 Reids(全量(全部写入 Redis),增量(实时更新))
    4. 读取 binlog 后,利用 MQ 推送更新各台的 redis 缓存数据;

    通过 Canal 组件监控 Mysql 中 binLog 日志的变化,把更新后的数据同步到 Redis 中。

    1. Canal 模拟 Mysql Slave 的交互协议,伪装自己为 Mysql Slave,向 Mysql Master 发送 dump 协议。
    2. Mysql Master 收到 dump 请求,开始推送 Binary log 给 slave(即 Canal)。
    3. Canal 解析 birary log 对象(原始为 Byte 流)。
  3. 面向缓存,所有读、写请求都在 Redis 中进行,发生写事件时由消息队列异步更新数据库。

    1. 漏洞:如果redis崩了,或者消息队列崩了,就有可能丢失数据,产生不一致。
    2. Redist作为数据库,并不能完全替代关系性数据库,很多还是要直接查询数据库。
  4. 如果是mybatis,可以重写mybatis的二级缓存。当执行更新操作时,异步清理掉对应mapper上的缓存。

    1. 局限性:仅限mapper层上的缓存,service缓存解决不了。
    2. 漏洞:如果另一个Java web 服务也在操作同一张表,但却没有缓存同步,就无解了
  5. 采用延时双删策略(双淘汰策略):在写入库前后都进行 redis.del(key)操作,设置合理超时时间(先删除缓存》写数据库》休眠毫秒==》再次删除缓存)

    1. 方案有以下几种:

      1. 先更新数据库,再删除缓存
      2. 先更新数据库,再更新缓存
      3. 先删除缓存,再更新数据库
      4. 先更新缓存,再更新数据库
    2. 漏洞:如果另一个Java web 服务也在操作同一张表,但却没有缓存同步,就无解了

    3. 漏洞:如果另一个Java web 服务也在操作同一张表,但却没有缓存同步,就无解了

  6. 设置缓存过期时间:给缓存设置过期时间短一些,所有写操作以数据库为准,只要达到缓存过期时间,则后面的读请求会从数据库读取新值然后回填缓存;

    1. 彻底佛系了。如果请求本就少,但是单个请求响应时间就很长。这个缓存加了和没加一样,没啥用。
  7. 如果不一致的数据是业务操作引起的,可以在业务操作时,对相应的缓存进行失效操作。

    1. 问题:一个业务操作会影响多少个缓存,如果漏掉问题就尴尬了。会造成线上bug
    2. 漏洞:如果另一个Java web 服务也在操作同一张表,但却没有缓存同步,就无解了

标签:缓存,数据库,Redis,更新,Mysql,操作,双写
From: https://www.cnblogs.com/futurelab/p/17955895/the-cache-database-dual-writing-is-inconsiste

相关文章

  • N天爆肝数据库——MySQL(3)
    (N天爆肝数据库——MySQL(3))本篇文章,主要对DCL、函数、约束和多表查询进行知识总结和学习。期待和大家一起学习进步。DCLDCL-介绍数据控制语言,用来管理数据库用户、控制数据库的访问权限。DCL-管理用户查询用户USEmysql;SELECT*FROMuser;创建用户CREATEUSER......
  • openGauss学习笔记-191 openGauss 数据库运维-常见故障定位案例-出现Error:No space l
    openGauss学习笔记-191openGauss数据库运维-常见故障定位案例-出现Error:Nospaceleftondevice提示191.1出现“Error:Nospaceleftondevice”提示191.1.1问题现象在数据库使用过程中,出现如下错误提示。Error:Nospaceleftondevice191.1.2原因分析磁盘空间不足......
  • 在Django中,`python manage.py makemigrations`和`python manage.py migrate`是两个用
    在Django中,`pythonmanage.pymakemigrations`和`pythonmanage.pymigrate`是两个用于数据库迁移的命令,它们的主要区别在于:-`pythonmanage.pymakemigrations`:这个命令主要是记录我们对`models.py`的所有改动,并且将这个改动迁移到`migrations`这个文件下生成一个文件,例如:`0001`......
  • Mybatis 拦截器实现单数据源内多数据库切换 | 京东物流技术团队
    物流的分拣业务在某些分拣场地只有一个数据源,因为数据量比较大,将所有数据存在一张表内查询速度慢,也为了做不同设备数据的分库管理,便在这个数据源内创建了多个不同库名但表完全相同的数据库,如下图所示:现在需要上线报表服务来查询所有数据库中的数据进行统计,那么现在的问题来了,该如何......
  • PGSQL(PostgreSQL)数据库基础篇:PostgreSQL 的 主要优点 、 劣势 、体系结构 、核心功
    PostgreSQL的主要优点1.维护者是PostgreSQLGlobalDevelopmentGroup,首次发布于1989年6月。2.操作系统支持WINDOWS、Linux、UNIX、MACOSX、BSD。3.从基本功能上来看,支持ACID、关联完整性、数据库事务、Unicode多国语言。4.表和视图方面,PostgreSQL支持临时表,而物化视图,可以......
  • Spring Boot中使用JPA进行数据库操作
    在Java后端开发中,数据库操作是一个非常重要的环节。SpringBoot作为当前非常流行的轻量级Java开发框架,提供了很多便捷的工具和功能,使得数据库操作变得更加简单快捷。在SpringBoot中,我们可以使用JPA(JavaPersistenceAPI)来进行数据库操作。JPA是一种将对象持久化到数据库的方法,它遵......
  • openGauss学习笔记-189 openGauss 数据库运维-常见故障定位案例-TPCC-WAL-内存
    openGauss学习笔记-189openGauss数据库运维-常见故障定位案例-TPCC-WAL-内存189.1TPCC运行时,注入磁盘满故障,TPCC卡住的问题189.1.1问题现象TPCC运行时,注入磁盘满故障,TPCC卡住,故障消除后,TPCC自动续跑。189.1.2原因分析数据库本身机制,在性能日志(gs_profile)所在磁盘满时,导致......
  • openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败
    openGauss学习笔记-190openGauss数据库运维-常见故障定位案例-服务启动失败190.1服务启动失败190.1.1问题现象服务启动失败。190.1.2原因分析配置参数不合理,数据库因系统资源不足,或者配置参数不满足内部约束,启动失败。由于部分数据节点状态不正常,导致数据库启动失败。......
  • 测试Kill MMON进程对数据库的影响
    文档课题:测试KillMMON进程对数据库的影响.数据库:oracle11.2.0.41、异常模拟[oracle@racogg:~]$ps-ef|grepmmon|grep-vgreporacle1387910Jan06?00:00:11ora_mmon_orcl[oracle@racogg:~]$ps-ef|grepora_smon|grep-vgreporacle......
  • 求实创新 不断探索 浙江移动基于亚信科技AntDB数据库率先完成CRM系统全域改造
    12日20日,中国信息通信研究院(简称:信通院)和中国通信标准化协会大数据库技术推进委员会(CCSATC601)共同组织的2023年大数据库“星河(Galaxy)”案例评选结果发布。中国移动通信集团浙江有限公司(以下简称:浙江移动)与亚信科技(中国)有限公司(简称:亚信科技)、湖南亚信安慧有限公司公司联合申报的《......