精华内容
下载资源
问答
  • redis和数据库一致性
    千次阅读
    2022-07-10 10:25:22

    在使用Redis中,我们都会遇到同样的问题,当一个请求要更新数据库时,Redis缓存显然也要被更新。我们必须要保证两者的一致性。
    而数据库和Redis是两个不同的进程,很难保证两个进程更新都一定能完成,一旦其中一个失败,或延时过长,就可能导致两者数据不一致,因而导致程序出错。
    因此保证两者一致性变了值得讨论的话题。

    首先数据库和缓存显然都是要更新的,那么无非就是顺序问题,那么就是一下两种情况。

    方案A 先更新数据库,再更新缓存

    方案B 先更新缓存,再更新数据库

    关于两者更新的顺序,显然只能选A不能选B。为什么呢?
    数据库和缓存其实是类似主从的概念,我们要明白,缓存是跟着数据库变的。那么就没有道理缓存优先数据库做更新。先更新缓存不符合原则。
    那么虽然不符合原则,他安不安全呢?
    不安全,举个栗子:

    1线程先更新缓存,还未更新数据库
    2线程后更新缓存,还未更新数据库
    2线程先更新数据库
    1线程后更新数据库

    此时,因为2线程后更新缓存,所以缓存是2线程的数据,因为1线程后更新数据库,所以数据库是1线程的数据。如此,导致数据不一致。
    所以该方案是不可接受的。

    那么A方案就是可靠的吗?不,A也不可靠,再举个栗子。

    1线程先更新数据库,还未更新缓存
    2线程后更新了数据库,还未更新缓存
    2线程先先一步更新缓存
    1线程后一步更新缓存

    导致数据库是2线程的值,缓存是1线程的值。同样不满足一致性。也不可接受。

    也就是说AB方案都不可接受
    那么解决方案是什么呢?
    更新数据时,删除缓存,这样查询就会去数据库取最新值。并更新到缓存。保证了缓存和数据库的最终一致
    当然,操作的顺序也有两种。

    方案C 先更新数据库,再删除缓存

    方案D 先删除缓存,再更新数据库

    我们之前也提到了,缓存和数据库的关系是主从关系。因此应该先更新数据库,再操作缓存。

    所以,只能选C。

    那么C方案是否可靠呢?
    绝大多数情况是可靠的。一般使用这种方法就足够了。
    也有一些特殊场景。

    步骤

    1线程更新数据库,还未删除缓存
    2线程查询缓存,返回旧数据
    1线程删除缓存

    可以看出,数据库已经更新了,但2线程拿到的是旧数据。对此时来说数据不对,随后1线程删除了缓存。
    虽然数据不对,但满足了数据的最终一致性。再次查询时获取的就是最新值。

    还有一种最差的场景
    缓存刚好失效时

    1线程查询数据库,获得值
    2线程更新数据库,还未删除缓存
    2线程删除缓存
    1线程将值保存至缓存

    这种场景下依旧会破坏一致性。不过可能性较小。需要满足缓存刚好失效,且刚好在更新数据。且刚好满足上述步骤。

    因此,一般情况下,C方案是可行的,除此之外,还需要考虑缓存删除失败的情况。

    缓存删除失败

    缓存删除失败就需要进行重试,重试的方法有多种。
    这里建议可以使用MQ,将删除失败的消息放入队列中。写一个方法监听这个队列,当有消息进入时,重新删除缓存。

    更多相关内容
  • 如何保证redis和数据库一致性

    千次阅读 2022-05-18 17:22:21
    在项目中难免会使用到redis作为缓存,去减轻数据库的访问压力,但是涉及到数据更新时,如果redis和数据库的操作设计出现问题,就会导致redis缓存中和数据库中的数据不一致的情况。那么我们如何去保证缓存与数据库中...

    在项目中难免会使用到redis作为缓存,去减轻数据库的访问压力,但是涉及到数据更新时,如果redis和数据库的操作设计出现问题,就会导致redis缓存中和数据库中的数据不一致的情况。那么我们如何去保证缓存与数据库中数据一直呢?

    四种同步策略

    想要保证缓存与数据库的双写一致,一共有四种方式,即四种同步策略
    1、先更新缓存,再更新数据库
    2、先更新数据库,再更新缓存
    3、先删除缓存,在更新数据库
    4、先更新数据库,再删除缓存
    更新缓存和删除缓存的选择
    更新缓存

    优点:
    如果每次数据变化都能被及时更新,那么查询数据时不容易出现不命中的情况,
    缺点:
    1、如果数据的计算复杂,频繁的更新会造成服务器性能的消耗比较大
    2、如果数据并不是被频繁使用,那么频繁更新也只是浪费服务器性能,对业务没有多大的帮助
    适用于数据使用较为频繁,且数据的计算不那么复杂的场景

    删除缓存

    优点:不需要顾忌数据的复杂性,直接删除即可
    缺点:查询数据时,增大未命中的几率,从而增大数据库的访问压力
    适用于数据使用频率不高的场景

    在上面四种同步策略中,都存在导致数据不一致的风险

    1、先删除缓存,再更新数据库

    在这里插入图片描述

    操作步骤:
    a、线程A删除缓存中的数据,
    b、线程A更新数据库中的数据,但是更新失败
    c、此时线程B去获取缓存中的数据,但是未命中
    d、线程B,去数据库中获取数据,但此时的数据因为更新失败为旧数据
    e、线程B将数据库中查到的数据同步到缓存中去
    f、线程A此时更新数据到数据库成功
    最后数据库和redis缓存中的数据不一致

    如果在更新数据库时没有出现失败,也同样存在会造成数据不一致的情况
    在这里插入图片描述
    操作步骤:
    a、线程A删除缓存中的数据,
    b、此时线程B去获取缓存中的数据,但是未命中
    c、线程B,去数据库中获取数据,但此时的数据因为更新失败为旧数据
    d、线程B将数据库中查到的数据同步到缓存中去
    e、线程A此时更新数据到数据库成功
    最后数据库和redis缓存中的数据不一致,这里造成的数据不一致的原因是线程B在数据库还未更新时就已经获取到了旧的数据。

    2、先更新数据库,再删除缓存

    在这里插入图片描述
    操作步骤:
    1、线程A更新数据库中的数据
    2、线程A删除缓存中的数据,删除失败
    3、线程B查询缓存中的数据,查询到旧数据
    4、线程A异步重试删除缓存
    这里,删除缓存中数据失败后就会造成线程B获取到缓存中的旧数据,从而导致数据不一致的情况

    如果缓存没有删除失败的情况也可能导致数据不一致
    在这里插入图片描述
    操作步骤:
    1、线程A更新数据库中的数据
    2、线程B查询缓存中的数据,查询到旧数据
    3、线程A删除缓存
    如果线程B在缓存删除前获取到了缓存中的数据,那么线程B获取到的还是旧数据,也会导致数据不一致的情况

    延时双删

    上面中先删除缓存,在更新数据库在不出现失败时也会出现数据不一致的情况,那么我们要有什么解决方案呢。我们就采用延时双删的策略来保证缓存中的数据时更新后的数据
    操作步骤
    1、先删除缓存
    2、更新数据库
    3、线程等待 N秒(等待时间根据具体业务来判断)
    4、再删除缓存
    这样就保证了缓存中的数据最终会和数据库中的数据保持一致

    数据库读写分离

    先删除缓存,在更新数据库,如果数据库采用读写分离架构会有什么影响呢?
    在这里插入图片描述

    操作步骤:
    1、线程A删除缓存
    2、线程A更新从数据库
    3、线程B查询缓存,未命中
    4、线程B去从数据库查询数据,还未同步,所以从数据库为旧数据
    5、线程B将数据更新到缓存中
    6、主数据库同步数据到从数据中
    这样还是会出现数据不一致的情况,那么我们要怎么解决呢?
    如果只是为了更新redis的数据的数据库查询,让线程同步数据时强行指定到主数据库执行

    展开全文
  • 如果Redis中没有对应缓存,则需要直接查询数据库,然后存入Redis,最后把数据返回。 通常情况下,我们会为某个缓存设置一个key值,并针对key值设置一个过期时间,如果被查询的数据对应的key过期了,则直接查询...

    在数据读多写少的情况下,作为缓存来使用,恐怕Redis的使用是最普遍的场景了。当时用Redis作为缓存的时候,一般流程是这样的。

    如果缓存在Redis中存在,即缓存命中,则直接返回数据。

    如果Redis中没有对应缓存,则需要直接查询数据库,然后存入Redis,最后把数据返回。

    通常情况下,我们会为某个缓存设置一个key值,并针对key值设置一个过期时间,如果被查询的数据对应的key过期了,则直接查询数据库,并将查询得到的数据存入Redis,然后重置过期时间,最后将数据返回,伪代码如下:

    /**
     * 根据用户名获取用户详细信息
     */
    public User getUserInfo(String userName) {
          User user = redisCache.getName("user:" + userName);
          if (user != null) {
              return user;
          }
    
          // 从数据库中直接搜索
          user = selectUserByUserName(userName);
          // 将数据写入Redis,并设置过期时间
          redisCache.set("user:" + userName, user, 30000);
          // 返回数据
          return user;
    }

    一致性问题

    在Redis的key值未过期的情况下,用户修改了个人信息,我们此时既要操作数据库数据,也要操作Redis数据。导致我们现在面临着2种选择:

    1. 先操作Redis的数据,在操作数据库的数据。

    2. 先操作数据库的数据,在操作Redis的数据。

    不论选择哪种处理方式,最理想的情况下,两个操作要么同时成功,要么同时失败,否则就会出现Redis和数据库的书库不一致情况。

    遗憾的是,目前没有什么框架能够保证Redis和数据库的数据一致性。我们只能根据场景和所需付出的代码来采取一定的措施,降低数据不一致出现的概率,在一致性和性能之间取一个折中。

    下面我们来讨论关于Redis和数据库质检数据一致性的一些方案。

    方案选择

    是删除缓存还是更新缓存?

    当数据库的数据发生变化的时候,Redis的数据也需要进行相应的操作,那么这个操作是选择 更新or删除呢?

    更新的话调用Redis的set方法,新值替换旧值;删除直接删除原来的缓存,下次查询直接去数据库读取,然后再更新Redis。

    结论:推荐直接使用删除操作。

    使用更新操作的话,会面临两种选择

    1.先更新缓存,再更新数据库。

    2.先更新数据库,再更新缓存。

    第一种不用考虑了,下面讨论一下第二种先更新数据库的方案。

    如果线程1和线程2同时进行更新操作,但是每个线程的执行顺序如上图所示,此时就会导致数据不一致,因此从这个角度上我们推荐直接使用删除缓存的方式。

    此外,推荐使用删除缓存还有两点原因。

    1.如果写数据库的场景比读数据库场景多,采用这种方案就会导致缓存被频繁写入,浪费性能;

    2.如果缓存要结果一系列的复杂计算才能得到,那么每次写入数据库后,都再次计算写入的缓存,无疑也是浪费性能的。

    明确了这个问题后,摆在我们面前的还是两个选择。

    1.先更新数据库,再删除缓存

    2.先删除缓存,再更新数据库

    先更新数据库,再删除缓存

    数据不一致的情况列举:

    1) 线程A读取商品数据,刚好缓存失效了,故查询数据库数据,刚要把得到的数据放入Redis缓存中,这时候cpu发生上下文切换,线程A暂时得不到执行。

    2)好,那么此时线程B来修改数据,执行update操作,然后删除缓存。

    3)再到线程A获得执行时间片后,继续执行未完成的操作,将之前查询到的旧数据存到Redis中,此时就会出现Redis和数据库的数据不一致。

    当然这种情况,条件比较严苛,出现的可能性较低一些。

    解决方案:

    那这种情况一般会有两种解决方式:失败重试异步更新。

    失败重试

    如果删除缓存失败,我们可以捕捉这个异常,把需要删除的key发送给消息队列。自己创建一个消费者消费,尝试再次删除这个key,直到删除成功为止。

     

    这种处理方式有个缺陷,首先会对业务代码造成入侵,其次引入了消息队列,增加了系统的不确定性。

    异步更新缓存

    因为更新数据库时会忘binlog中写入日志,所以我们可以启动一个监听binlog变化的服务(比如使用阿里的canal开源组件),然后再客户端完成删除key操作。如果删除失败的话,再发送到消息队列。

    总结:

    总而言之,对于删除缓存失败的情况,我们的做法是不断地尝试删除操作,直到成功。无论选择哪种处理方式,始终只能保证一点时间内的最终一致性。只要系统有写的操作,就无法保证任意时刻的一致性。

    先删除缓存,再更新数据库

    数据不一致的情况:

    1) 线程A修改数据库时,需先删除缓存数据

    2) 线程B在线程A删除缓存和执行update操作期间,查询了数据库得到了旧数据,再写入Redis缓存,此时就有极大的概率会出现数据不一致的情况。

     

    解决方案列举:

    之前项目里就有过类似的解决方案:先操作缓存,但是不能删除缓存,可以将缓存设置为一个特殊值,与业务无关的一个特殊值(-999),客户端读取缓存时,发现时特殊值,就休眠一会,再去查一次Redis。(注意:特殊值是对业务有侵入的,指不定什么时候就会用到这个特殊值。以及休眠时间,可能会多次重复,如高并发情况下,缓存频繁被设置为特殊值,那么进来访问的线程都会进入休眠状态,这样对性能会有影响)

    下面介绍另一种业内常见的机制,延时双删策略

    先删除缓存,再写入数据库,休眠一会,再次删除缓存,如果写操作很频繁,同样会存在读取到脏数据的问题。注意:如线程进行sleep休眠一秒,系统对接口的性能要求比较高,超过半秒都不行,更别说一秒了。那么可以启动一个线程来异步执行延迟删除key,就可以解决时间问题。使用@Async注解来进行删除key即可。

    @Async介绍:在Spring中,基于@Async标注的方法,称之为异步方法。这些方法在执行的时候,会独立起一个线程,调用者无需等待它的完成,即可继续其他操作。

    延迟双删策略理解图。

    用伪代码表示就是:

    /**
     * 延时双删
     */
    public void update(String key, Object data) {
        // 首先删除缓存
        redisCache.delKey(key);
        // 更新数据库
        db.updateData(data);
        // 休眠一段时间,时间依据数据的读取耗费的时间而定
        Thread.sleep(500);
        // 再次删除缓存
        redisCache.delKey(key);
    }

    总结:

    总结还是同理,不论如何处理,选择那种方式,始终只能保证一点时间内的最终一致性。只要系统有写的操作,就无法保证任意时刻的一致性。

    展开全文
  • Redis数据库的数据一致性

    千次阅读 2022-02-14 22:14:25
    数据库内容变化的时候,到底应该先操作数据库还是先操作缓存呢?本文带你了解如何解决Redis和数据库的数据一致性问题

    公众号「蝉沐风」,欢迎大家关注交流


    在数据读多写少的情况下作为缓存来使用,恐怕是Redis使用最普遍的场景了。当使用Redis作为缓存的时候,一般流程是这样的。

    • 如果缓存在Redis中存在,即缓存命中,则直接返回数据

    image.png

    • 如果Redis中没有对应缓存,则需要直接查询数据库,然后存入Redis,最后把数据返回

    image_1.png

    通常情况下,我们会为某个缓存设置一个key值,并针对key值设置一个过期时间,如果被查询的数据对应的key过期了,则直接查询数据库,并将查询得到的数据存入Redis,然后重置过期时间,最后将数据返回,伪代码如下:

    /**
     * 根据用户名获取用户详细信息
     * @author 公众号【蝉沐风】
     */
    public User getUserInfo(String userName) {
          User user = redisCache.getName("user:" + userName);
          if (user != null) {
              return user;
          }
    
          // 从数据库中直接搜索
          user = selectUserByUserName(userName);
          // 将数据写入Redis,并设置过期时间
          redisCache.set("user:" + userName, user, 30000);
          // 返回数据
          return user;
    }
    

    一致性问题

    但是,在Redis的key值未过期的情况下,用户修改了个人信息,我们此时既要操作数据库数据,也要操作Redis数据。现在我们面临了两种选择:

    1. 先操作Redis的数据,再操作数据库的数据
    2. 先操作数据库的数据,再操作Redis的数据

    如论选择哪种方法,最理想的情况下,两个操作要么同时成功,要么同时失败,否则就会出现Redis和数据库数据不一致的情况。

    遗憾的是,目前没有什么框架能够保证Redis的数据和数据库的数据的完全一致性。我们只能根据场景和所需要付出的代码来采取一定的措施降低数据不一致出现的概率,在一致性和性能之间取得一个折中。

    下面我们来讨论一下关于Redis和数据库之间数据一致性的一些方案。

    方案选择

    是删除缓存还是更新缓存?

    当数据库数据发生变化的时候,Redis的数据也需要进行相应的操作,那么这个「操作」到底是用「更新」还是用「删除」呢?

    「更新」的话调用Redis的set方法,新值替换旧值;「删除」直接删除原来的缓存,下次查询的时候重新读取数据库,然后再更新Redis。

    结论:推荐直接使用「删除」操作

    因为使用「更新」操作的话,你会面临两种选择

    1. 先更新缓存,再更新数据库
    2. 先更新数据库,再更新缓存

    第1种不用考虑了,下面讨论一下「先更新数据库,再更新缓存」这种方案。

    image_2.png

    如果线程1和线程2同时进行更新操作,但是每个线程的执行顺序如上图所示,此时就会导致数据不一致,因此从这个角度上我们推荐直接使用删除缓存的方式。

    此外,推荐使用「删除缓存」还有两点原因。

    1. 如果写数据库的场景比读数据场景多,采用这种方案就会导致缓存就被频繁写入,浪费性能;
    2. 如果缓存要经过一系列复杂的计算才能得到,那么每次写入数据库后,都再次计算写入的缓存无疑也是浪费性能的。

    明确这个问题之后,摆在我们面前的就只有两个选择了:

    • 先更新数据库,再删除缓存
    • 先删除缓存,再更新数据库

    先更新数据库,再删除缓存

    这种方式可能存在以下两种异常情况

    1. 更新数据库失败,这时可以通过程序捕获异常,直接返回结果,不再继续删除缓存,所以不会出现数据不一致的问题
    2. 更新数据库成功,删除缓存失败。导致数据库是最新数据,缓存中的是旧数据,数据不一致

    第2种情况应该怎么办呢?我们有两种方式:失败重试异步更新

    失败重试

    如果删除缓存失败,我们可以捕获这个异常,把需要删除的 key 发送到消息队列。自己创建一个消费者消费,尝试再次删除这个 key,直到删除成功为止。

    image_3.png

    这种方式有个缺点,首先会对业务代码造成入侵,其次引入了消息队列,增加了系统的不确定性。

    异步更新缓存

    因为更新数据库时会往 binlog 中写入日志,所以我们可以启动一个监听 binlog变化的服务(比如使用阿里的 canal开源组件),然后在客户端完成删除 key 的操作。如果删除失败的话,再发送到消息队列。

    总结

    总之,对于删除缓存失败的情况,我们的做法是不断地重试删除操作,直到成功。无论是重试还是异步删除,都是最终一致性的思想。

    先删除缓存,再更新数据库

    这种方式可能存在以下两种异常情况

    1. 删除缓存失败,这时可以通过程序捕获异常,直接返回结果,不再继续更新数据库,所以不会出现数据不一致的问题
    2. 删除缓存成功,更新数据库失败。在多线程下可能会出现数据不一致的问题

    image_4.png

    这时,Redis中存储的旧数据,数据库的值是新数据,导致数据不一致。这时我们可以采用延时双删的策略,即更新数据库数据之后,再删除一次缓存。

    image_5.png

    用伪代码表示就是:

    /**
     * 延时双删
     * @author 公众号【蝉沐风】
     */
    public void update(String key, Object data) {
        // 首先删除缓存
        redisCache.delKey(key);
        // 更新数据库
        db.updateData(data);
        // 休眠一段时间,时间依据数据的读取耗费的时间而定
        Thread.sleep(500);
        // 再次删除缓存
        redisCache.delKey(key);
    }
    

    最后给读者留下两个思考题:

    1. 为什么先更新缓存,再更新数据库行不通?
    2. 延时双删的方法为什么要休眠一段时间呢?

    欢迎大家评论区留言。


    推荐阅读

    公众号「蝉沐风」,欢迎大家关注交流

    展开全文
  • 如何保证Redis缓存和数据库一致性

    千次阅读 2022-04-06 19:44:16
    Redis嘛,就是一种运行速度很快,并发很强的跑在内存上的NoSql数据库,支持键到五种数据类型的映射,(string、list、set、zset、hash),而memecache只能支持简单的数据类型。另外redis可以完成一部份数据的持久化,...
  • redis 数据库双写一致性
  • 如何保证Redis缓存与数据库一致性

    万次阅读 多人点赞 2022-01-07 09:50:38
    想要保证缓存与数据库的双写一致,一共有4种方式,即4种同步策略: 先更新缓存,再更新数据库; 先更新数据库,再更新缓存; 先删除缓存,再更新数据库; 先更新数据库,再删除缓存。 从这4种同步策略中,我们需要...
  • 如何保证redis和数据库数据的一致性

    千次阅读 2022-05-12 12:33:28
    所以一般只需要保证redis和数据库数据的最终一致性即可,此时只需要在数据存入缓存的时候加上失效时间,这样到一定时间之后,自然会重新查数据库存入缓存,此时两边数据就一致了。 用例:比如页面上的一个数据总条...
  • 业务场景 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。...读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的...
  • 如何redis和数据库之间的一致性

    千次阅读 2020-06-02 16:02:16
    因为写读是并发的,没法保证顺序,如果删除了缓存,还没有来得及写库,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。如果先写了库,在删除缓存前,写库的线程宕机了,...
  • (扩展二)redis和数据库一致性

    千次阅读 2020-11-10 22:38:35
    一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶尔有不一致的情况,最好不要做这个方案:读请求写请求串行化,串到一个内存队列里去,这样就可以保证一定不会出现不...
  • 为了解决缓存和数据库的数据一致性问题 - 分布式读写锁 分布式读写锁 使用分布式读写锁可以完美解决缓存数据不一致的问题,想要读数据必须等待写数据整个操作完成。 使用阿里中间件canal: 数据同步中间件,可以用于...
  • Redis数据库一致性问题分析

    万次阅读 多人点赞 2019-07-01 20:35:58
    缓存已经在项目中被广泛使用,在读取缓存方面,大家没啥疑问,都是...先做一个说明,从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写...
  • (2)、如果写数据库的值与更新缓存的值不一致,写入缓存中的数据需要经过几个表的关联计算后得到的结果插入缓存中,那就没有必要马上更新缓存,只有删除缓存即可,等到查询的时候在去把计算后得到的结果插入到缓存...
  • 如何保证Redis数据库的数据一致性

    千次阅读 2021-06-01 09:16:41
    读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。 不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有...
  • redis数据库双写一致性问题
  • 一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 “缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:读请求写请求串行化,串到一个内存...
  • redis和数据库一致性问题笔记

    千次阅读 2022-03-23 11:02:50
    分为实时一致性和最终一致性。 缓存使用场景 更新或者删除数据时 先操作redis还是先操作数据库 更新redis数据,是直接更新还是直接删除? 正常是直接删除del 方案1:先更新数据库,再删除缓存 正常情况:...
  • 首先,我们先来看看有哪几种一致性的情况呢?如果你的项目对缓存的要求是强一致性的,那么请不要使用缓存。这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往...
  • 如何保证redis数据库的数据一致

    千次阅读 2022-02-24 11:25:11
    1.先删缓存,再更新数据:缓存删除后更新数据失败,再查数据,这样Redis和数据库的数据是一致的。但是在高并发场景下,第一个线程删除了缓存,还没来得及改数据,第二个线程来读取数据,发现缓存为空,那就去数据库...
  • Redis和数据库数据不一致的问题

    千次阅读 2021-12-06 21:26:00
    • 如果数据在Redis存在,应用就可以直接从Redis拿到数据,不用访问数据库。 • 如果Redis里面没有,先到数据库查询,然后写入到Redis,再返回给应用。 问题一: 一旦被缓存的数据发生变化的时候,我们既要操作...
  • redis 数据库 缓存一致性

    千次阅读 2022-02-08 20:06:22
    1.常用的缓存图如下: ...3.不能使用先删除缓存,再写库的,问题说明,线程1删除了缓存,此时线程查询,会将数据库的值写入缓存,线程1进行更新,此时会发现缓存和数据库一致。 下面是先操作数据库,再操作...
  • 既然要解决这个问题,那么首先要大概了解为啥会出现数据不一致呢?根本原因是我们无法将数据库更新操作与缓存更新操作放在同一个事务内同步成功,同步失败! 下面列举几个常见的操作以及各自的问题 1、先更新...
  • 当我们对数据进行修改的时候,到底是先删缓存还是先写数据库? 1.如果先删缓存,在写数据库。...客户端读取数据,发现是默认值,就休眠一会,再查redis。特殊值对业务有侵入,休眠时间可能会对此重复,影响性能 2.
  • 如何保障mysql和redis之间的数据一致性? 1.强一致(向数据库插入一条数据时,同时向redis中也插入一条数据) 2.定时任务:设置过期时间 结合实际场景,解决redis和mysql的数据一致性 在并发不高的情况下:读操作...
  • Redis在国内各大公司都很热门,比如新浪、阿里、腾讯、百度、美团、小米等。Redis也是大厂面试最爱问的,尤其是Redis客户端、Redis高级功能、Redis持久化...
  • redis缓存与数据库一致性问题解决

    千次阅读 2021-07-02 11:34:53
    数据库的数据缓存中的数据如何达到一致性?首先,可以肯定的是,redis中的数据和数据库中的数据不可能保证事务性达到统一的,这个是毫无疑问的,所以在实际应用中,我们都是基于当前的场景进行权衡降低出现不一致...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 132,524
精华内容 53,009
关键字:

redis和数据库一致性