美文网首页
redis缓存一致性问题解决方案

redis缓存一致性问题解决方案

作者: 湖与月 | 来源:发表于2022-10-08 21:57 被阅读0次

场景

我们在很多情况下会使用缓存提高查询效率,减小数据库压力。但是引入缓存后,就要面对如何保证缓存与DB数据一致性的问题。在讨论以下方案前,得先明白任何方案都不是百分百可靠且适用你的,要依据业务场景做出选择。

解决方案

  1. 先更新/删除缓存,再更新DB
  2. 先更新DB,再更新/删除缓存
  3. 延迟双删
  4. 先更新DB,再使用binlog日志+消息队列更新/删除缓存

先更新/删除缓存,再更新DB

如果先更新缓存,然后更新DB的动作失败,下一个请求获取到的依然是旧值,DB上的也是旧值,那么当缓存过期后,之前的更新操作完全失效就很奇怪了。
如果先更新缓存,再更新DB,下一个请求获取到的可能依然是旧值。


先更新缓存,再更新DB

先更新DB,再更新/删除缓存

如果先更新DB,然后操作缓存失败或出现并发,下一个请求获取到的依然是旧值,但是DB上是最新的,当缓存过期后,重新写入缓存的就是最新值。
如果先更新DB,再更新缓存,下一个请求获取到的可能依然是旧值。


先更新DB,再更新缓存.png

延迟双删

延迟双删是指在操作缓存后,再更新DB,等待一段时间后(一般要求大于一次缓存操作时间),再操作一次缓存。
但其实在并发的时候也可能出现在二次更新缓存后,有其他线程又将他更新成旧值。

先更新DB,再使用binlog日志+消息队列更新/删除缓存

使用消息队列的好处是自带了重试机制,增加了操作缓存成功率。对于复杂的缓存操作,也实现了解耦。但是复杂度也大大提升了,也提升运维成本,并且面对高并发,还会有性能问题。

删除缓存还是更新缓存

还有个容易让人纠结的问题是,如何操作缓存,是删除缓存还是更新缓存?

更新缓存

更新缓存最大的好处就是简单方便。

删除缓存

如果你是一个写入DB场景比较多,而读取DB场景比较少的业务需求,采用这种方案就会导致,数据压根还没读到,缓存就被频繁的更新,浪费性能。
如果在写入缓存前,要经过一系列复杂的计算再写入缓存。那么,每次写入数据库后,都再次计算写入缓存的值,无疑是浪费性能的。显然,删除缓存更为适合。

总结

综合各方面考量,最好的方案是使用分布式锁+延迟双删,在查询的时候加上分布式锁还有双重校验。现在大部分应用都实现了分布式锁,再加上数据库事务的使用,这已经解决了大部分的缓存一致性问题。以上讨论更重要的是帮大家总结归纳各个场景,以便大家更深层的研究。

相关文章

  • 缓存

    通过本文档,你将会了解到 为什么要使用缓存 本地缓存它不香么?为什么要使用redis缓存, 缓存一致性问题,缓存穿...

  • Redis常用缓存读写策略

    数据库与Redis保持缓存一致性问题 旁路缓存模式 这是平时使用比较多的一个缓存读写模式,比较适合读请求比较多的场...

  • 2、java内存模型

    在1、高速缓存与硬件基础中介绍了数据一致性问题的产生原因及其硬件层面的解决方案。可知:高速缓存的引入会产生数据一致...

  • Redis缓存穿透和缓存雪崩以及解决方案

    Redis缓存穿透和缓存雪崩以及解决方案缓存穿透解决方案布隆过滤缓存空对象比较缓存雪崩解决方案保证缓存层服务高可用...

  • Redis缓存一致性问题

    简介 只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题。 解决办法1 如...

  • 缓存

    缓存如何使用?缓存使用不当会造成什么后果? 缓存击穿有哪些解决方案? redis内部原理? redis和memca...

  • Redis缓存雪崩和缓存穿透

    一 缓存雪崩 主要是redis挂了导致。 缓存雪崩解决方案:* redis cluster保证高可用(或者redi...

  • 高并发架构修炼

    redis缓存策略 分布式缓存一致性 redis常见的问题 redis分布式锁 http://ifeve.com/...

  • redis缓存一致性问题解决方案

    场景 我们在很多情况下会使用缓存提高查询效率,减小数据库压力。但是引入缓存后,就要面对如何保证缓存与DB数据一致性...

  • java并发编程(一)缓存一致性协议

    多线程环境下存在的问题 缓存一致性问题,指令重拍问题,可见性,有序性, 缓存一致性问题 在多处理器系统中,每个处理...

网友评论

      本文标题:redis缓存一致性问题解决方案

      本文链接:https://www.haomeiwen.com/subject/zxmwartx.html