当前位置: 首页 > 知识库问答 >
问题:

java - redis缓存一致性如何考虑数据库事务的影响?

汪信鸥
2024-07-09

redis缓存一致性方案,网上统一比较认同的为 延迟双删 方案。即:

写DB
删除缓存
延迟n秒
再次删除缓存

但所有文章都没有涉及到 数据库事务、 以及事务隔离性问题。
假如在一个数据库事务中,涉及到执行读写数据库操作 10 次,
那么问题是,删除缓存的时机是每次执行数据库操作之后即删除或更新缓存吗?
还是要先将事务内的数据库变动 缓存起来,等事务提交时,再一次性同步到底层redis?

在事务中更新缓存的话,带来的严重问题就是会破坏 数据库事务的隔离性,比如一般事务隔离性为读已提交,但事务中更新缓存,会导致事务隔离性变成读未提交,即事务回滚导致读到脏数据问题。
但如果缓存在整个事务结束时一次性同步redis的话, 由于事务执行时间远大于一次单独的SQL操作,
无疑会大大增加并发读写出现缓存和DB不一致的几率(即延迟双删要解决的问题)。

在实际项目中,大家都是怎么做的呢?比如要做一个查询缓存层的话
何时缓存数据、何时删除数据呢?

感谢分享!(比较奇怪,网上为何搜不到一点redis和db事务相关的内容?)

共有1个答案

羿易安
2024-07-09

你已经提出了缓存延时双删策略了,其实不存在同步redis,会直接删除redis,当然还是会有一定几率出现,但是当引入缓存机制的系统,就默认接受一定的容错,如果你的系统这个模块就需要高精度的强一致性,建议还是在mysql直接实现,不要引入缓存策略

 类似资料:
  • 比如使用Redis缓存了listUser的结果集,然后插入/更新/删除了数据,那怎么保证listUser的结果是最新的呢?如果说通过在插入/更新/删除操作后清空缓存,那在插入/更新/删除的操作很频繁时要如何解决呢?频繁的删缓存,那缓存的意义也就不存在了。这个问题要如何解决呢?

  • 本文向大家介绍如何保证缓存与数据库双写时的数据一致性?相关面试题,主要包含被问及如何保证缓存与数据库双写时的数据一致性?时的应答技巧和注意事项,需要的朋友参考一下 合理设置缓存的过期时间。 新增、更改、删除数据库操作时同步更新 Redis,可以使用事物机制来保证数据的一致性。

  • 面试题 如何保证缓存与数据库的双写一致性? 面试官心理分析 你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 面试题剖析 一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 “缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去。 串行

  • 1、淘汰缓存 数据如果为较为复杂的数据时,进行缓存的更新操作就会变得异常复杂,因此一般推荐选择淘汰缓存,而不是更新缓存。 2、选择先淘汰缓存,再更新数据库 假如先更新数据库,再淘汰缓存,如果淘汰缓存失败,那么后面的请求都会得到脏数据,直至缓存过期。 假如先淘汰缓存再更新数据库,如果更新数据库失败,只会产生一次缓存穿透,相比较而言,后者对业务则没有本质上的影响。 3、延时双删策略 如下场景:同时有一

  • 我正在尝试使用SpringJTA-JPA-Hibernate了解事务传播的行为。 本质上,我正在尝试更新一个实体。为此,我编写了一个测试方法,其中我使用实体管理器(em)查找方法获取对象(所以现在这个对象是管理对象)。更新获取的对象的属性。然后可选地调用正在调用em.merge的服务层(服务层传播=必需) 现在我这里有三个变体: > < li> 测试方法没有事务注释。更新提取的对象的属性,不调用服

  • 问题内容: 如果高速缓存一致性是在硬件级别实现的,为什么我们需要可变的?任何内核/处理器都应该获得最新值吗? 还是完全解决了另一个问题? 问题答案: 高速缓存一致性可以在处理器级别实现,但是,除非处理器内存模型保证顺序一致性(在大多数现代体系结构中不是这种情况),否则只有在需要时才会获得高速缓存一致性。 这就是volatile的含义:它要求JVM生成相关的机器指令,这些指令将要求处理器将其缓存与主