chen3435 2023-06-04 16:06 采纳率: 100%
浏览 14
已结题

请问一下,怎么保证缓存和数据库数据的一致性?有点没搞懂

请问一下,怎么保证缓存和数据库数据的一致性?有点没搞懂,有点迷糊

  • 写回答

1条回答 默认 最新

  • 陈老老老板 奇安信开发工程师 2023-06-04 16:09
    关注

    整体采用四种方式,可以先看一下,如果还不清楚再问我,十分乐意回答
    1、淘汰缓存

    数据如果为较为复杂的数据时,进行缓存的更新操作就会变得异常复杂,因此一般推荐选择淘汰缓存,而不是更新缓存。

    2、选择先淘汰缓存,再更新数据库

    假如先更新数据库,再淘汰缓存,如果淘汰缓存失败,那么后面的请求都会得到脏数据,直至缓存过期。

    假如先淘汰缓存再更新数据库,如果更新数据库失败,只会产生一次缓存穿透,相比较而言,后者对业务则没有本质上的影响。

    3、延时双删策略

    如下场景:同时有一个请求A进行更新操作,另一个请求B进行查询操作。

    请求A进行写操作,删除缓存
    请求B查询发现缓存不存在
    请求B去数据库查询得到旧值
    请求B将旧值写入缓存
    请求A将新值写入数据库
    次数便出现了数据不一致问题。采用延时双删策略得以解决。

    public void write(String key,Object data){
        redisUtils.del(key);
        db.update(data);
        Thread.Sleep(100);
        redisUtils.del(key);
    }
    
    

    这么做,可以将1秒内所造成的缓存脏数据,再次删除。这个时间设定可根据俄业务场景进行一个调节。

    4、数据库读写分离的场景

    两个请求,一个请求A进行更新操作,另一个请求B进行查询操作。

    请求A进行写操作,删除缓存
    请求A将数据写入数据库了,
    请求B查询缓存发现,缓存没有值
    请求B去从库查询,这时,还没有完成主从同步,因此查询到的是旧值
    请求B将旧值写入缓存
    数据库完成主从同步,从库变为新值
    依旧采用延时双删策略解决此问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月12日
  • 已采纳回答 6月4日
  • 创建了问题 6月4日