zoukankan      html  css  js  c++  java
  • Redis 如何保证缓存与数据库双写时的数据一致性

    写请求来了,要更新数据库和缓存,一前一后更新,就可能导致缓存和DB中的数据在一段时间内不一致。

    你只要用缓存,就可能会涉及到缓存与数据库双存储双写你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题

    一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶尔有不一致的情况,

    如果是强一致性,读请求和写请求串行化,串到一个内存队列里去,这样就可以保证一定不会出现不一致的情况(效率极低。)

    串行化之后,就会导致系统的吞吐量会大幅度的降低,用比正常情况下多几倍的机器去支撑线上的一个请求。

    还有一种方式就是可能会暂时产生不一致的情况,但是发生的几率特别小,就是先更新数据库,然后再删除缓存。

    这种情况不存在并发问题么?

    不是的。假设这会有两个请求,一个请求A做查询操作,一个请求B做更新操作,那么会有如下情形产生

    (1)缓存刚好失效
    (2)请求A查询数据库,得一个旧值
    (3)请求B将新值写入数据库
    (4)请求B删除缓存
    (5)请求A将查到的旧值写入缓存

    ok,如果发生上述情况,确实是会发生脏数据。

    然而,发生这种情况的概率又有多少呢?

    发生上述情况有一个先天性条件,就是步骤(3)的写数据库操作比步骤(2)的读数据库操作耗时更短,才有可能使得步骤(4)先于步骤(5)。可是,大家想想,数据库的读操作的速度远快于写操作的(不然做读写分离干嘛,做读写分离的意义就是因为读操作比较快,耗资源少),因此步骤(3)耗时比步骤(2)更短,这一情形很难出现。

    如何解决上述并发问题?

    首先,给缓存设有效时间是一种方案。其次,采用异步延时删除策略,保证读请求完成以后,再进行删除操作。

  • 相关阅读:
    PDA设备小知识--(IP)工业防护等级含义
    实施项目--如何推进项目实施进度
    Git.Framework 框架随手记--存储过程简化
    Git.Framework 框架随手记--SQL配置文件的使用
    Git.Framework 框架随手记--ORM查询数据集合 二
    介绍 Scratch 3.0:扩展编码创造力
    微服务架构:引领数字化转型的基石
    网易云技术开放日 云安全专场分享圆满结束
    JVM调优推荐
    springboot + mybatis + 多数据源
  • 原文地址:https://www.cnblogs.com/liufei1983/p/12103523.html
Copyright © 2011-2022 走看看