如何使缓存与数据库保持同步?

时间:2016-11-23 08:37:13

标签: java spring-mvc ehcache

我们有定期更新的数据库。我正在使用ehcache和mysql数据库。

现在,一旦数据库更新,我们需要根据更新从数据库中提取一些信息并将其发布到缓存。

  1. 我应该如何让我的数据库与缓存保持同步(缓存应该在数据库更新时更新)?
  2. 我应该如何知道数据库何时更新?

2 个答案:

答案 0 :(得分:3)

这是缓存引入的经典问题。您复制数据的那一刻 - 在数据库和缓存中 - 会引入一致性问题。

此问题没有答案。

对于1,答案取决于防止从缓存提供过时数据的重要性。在某些情况下,这不是问题,使用较短的到期时间将解决它。在其他情况下,您必须在缓存中包含最新数据,然后您必须确保缓存的条目无效。

请注意,以完全安全的方式执行此操作很难,这就是为什么Hibernate has so many second level cache strategies更安全,更安全,但也更慢,更慢。

对于问题2,这是特定于您的申请。如果只有您的应用程序更新数据库,那么您知道何时使缓存无效。如果数据库在外部更新,则必须使该系统知道您的应用程序 - 或至少是缓存 - 以便它可以发送失效。

答案 1 :(得分:0)

有多种方法可以将缓存与数据库同步,但这取决于您使用的缓存。 在分布式缓存中,以下是确保缓存中有效数据的方法。

  1. 使用有效期(仍然不会保证数据的有效性)(Redis支持的功能, NCache,Apache Ignite ...)
  2. 使用SQL,Oracle依赖项(NCache支持的功能)
  3. 使用基于通知(例如Cosmos和mongo db)的自定义依赖关系可提供数据库更改通知(NCache支持的功能)