• 【Redis】Redis做为缓存,MySQL如何与Redis保持数据一致


    Redis的作用

    一般情况下Redis是用来实现应用和数据库之间的一个读操作的缓存层,主要目的是减少数据库的io,还可以提升数据库io性能

    方法一:

    先更新MySQL数据库,再删除缓存,再从数据库查询到的最新的数据同步到redis。采用最终一致性性策略。

    缺点:相较于mq的方式,这种方式由于要查数据库并将最新数据写到redis,可能会造成接口响应速度变慢。

    方法二:

    更新mysql数据库,再采用mq异步的方式,将数据同步到redis中。

    缺点:数据同步延时概率比较大,数据库的更改信息投递到mq中,消费者可能没来得及消费消息同步数据到redis。

    优点:异步解耦

    方法三:

    基于订阅mysql binlog,采用mq异步的形式将数据同步到redis(canal框架)。

    将mysql以主从的方式部署,主库负责写,从库负责读,当主库的binlog日志文件发生改变时,将信息同步到从库,从库执行对应的sql,保证主从一致性。

    canalServer端,伪装成mysql的从节点,订阅mysql主节点的binlog文件,当主节点的binlog发生变化时,会将binlog日志文件发送给canalServer端,自己创建的处理程序连接到canalServer端,将数据同步到redis。

    优点:手动直接更改数据库也会自动同步到redis。

    方法四:

    延时双删策略(不推荐)

    • 先删缓存,在更新mysql并同步到redis,在高并发的情况下,第一个线程还没来得及更新mysql时,其他线程读取到的缓存可能为null值,将mysql旧的数据同步到redis中了。

    解决办法:延时删除,在t1线程更新数据库之后,sleep一段时间再去删除缓存。

    缺点:t1线程延时多少秒再去删除缓存中的key?难以控制,得根据业务逻辑的执行时间和写缓存的时间来进行估算。

    补充:什么是双写一致性协议?

    先更新数据库,在更新缓存。

    1. updateDB();
    2. updateredis();

    多个线程同步修改mysql和redis时,由于mysql行锁机制,多个线程同时修改同一行数据,只能有一个线程修改成功,两个线程更新完数据库后同时更新redis,由于不能确保两个线程更新缓存的先后顺序,可能会造成数据库和缓存的不一致性。

    解决办法:使用事务保证更新数据库和更新缓存整个两个操作的原子性。

  • 相关阅读:
    大数据平台下的数据治理
    19【迭代器设计模式】
    2023年全国大学生电子信息竞赛E题——自动追踪系统(stm32和openmv+普通舵机)完美解决第四问
    【Builder模式】C++设计模式——构建器
    Idea安装使用教程~
    DSPE-PEG-FITC,Fluorescein-PEG-DSPE,磷脂-聚乙二醇-荧光素修饰脂质体表面
    wordpress 安装主题显示要配置FTP的解决办法
    基于C++QT框架的地铁换乘可视化查询系统
    趋势安全软件卸载:如何不需要密码或忘记密码卸载Trend Micro OfficeScan Agent?
    web需求记录
  • 原文地址:https://blog.csdn.net/wjianwei666/article/details/133271569