• Mysql和Redis如何保证数据一致性


    文章目录


    前言

    如何保证数据库和缓存双写一致,下面提供几种方法,来讨论下他们的优缺点。


    一、先更新数据库,再更新redis

    这种方案,应该没人采用。
    如果先更新数据库成功,接着更新redis失败,那么会造成数据不一致,所以这种方法舍弃

    二、先更新redis,在更新数据库

    这种方案和第一种相似,也具有相同的问题
    如果更新reids成功,更新数据库失败,那么同样会造成数据不一致

    三 先更新数据库,再删除redis

    这种方案,同样会造成数据不一致的问题,但是相比上两个方案,如果他设置key的过期时间,那么保证了数据的最终一致性。如果在更新数据库后删除redis失败,又未设置redis过期时间。那么会造成数据不一致。

    如果线程A更新数据库,正准备更新redis时。线程B在更新线程A更新redis前获取了redis中的数据,那么其他数据拿到的数据还是旧数据,如果删除redis失败也会造成数据不一致

    解决方案:
    1.mysql和redis设置事务,在发生异常时回滚数据
    2.redis设置重试机制,在删除失败后进入重试模式

    四 先删除redis,再更新数据库

    这种方案,同样存在一定几率的不一致现象,但是已经接近最优了。

    如果线程A删除了redis,正准备更新数据库。线程B查询了redis没有之后,查询了数据库的旧数据,并且把它写到redis。之后线程A才更新数据成功,会出现数据库和redis的数据不一致

    解决方案:延迟双删

    线程A在删除redis以及更新数据库后,睡眠一段时间后,再次删除reids中的数据。这个睡眠时间得大于一次查询的时间。


    总结

    数据一致性没有绝对的保证,要么牺牲性能加锁,要么串行。在高并发下,这些方案都只能做到优化

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    AVR汇编(五):算术和逻辑指令
    Linux环境基础开发工具使用
    从0开始学汇编第一天:基础知识
    关于nginx反向代理使用域名的缓存问题
    ASSIST-GAI全色域指数计算工具
    Oracle数据库连接之TNS-12541异常
    【牛客 - 剑指offer】JZ21 调整数组顺序使奇数位于偶数前面(一) 三种方案 Java实现
    【无标题】
    重庆市5米数字高程(DEM)数据
    docker学习学记
  • 原文地址:https://blog.csdn.net/drhrht/article/details/126113502