如何保持缓存与数据库同步?
How to keep the cache in sync with the database?
我们有定期更新的数据库。我正在使用 ehcache 和 mysql 数据库。
现在,一旦数据库更新,我们需要根据更新从数据库中提取一些信息并将其发布到缓存中。
- 我应该如何使我的数据库与缓存保持同步(缓存应该随着数据库的更新而更新)?
- 我怎么知道数据库何时更新?
这是缓存引入的经典问题。在复制数据的那一刻 - 在数据库和缓存中 - 你会引入一致性问题。
此问题没有单一答案。
对于 1,答案取决于防止从缓存中提供陈旧数据的重要性。在某些情况下,这不是问题,使用较短的到期时间即可解决问题。在其他情况下,您必须在缓存中拥有最新数据,然后您必须确保缓存的条目无效。
请注意,以完全安全的方式执行此操作很难,这就是为什么 Hibernate has so many second level cache strategies 越来越安全,但也越来越慢。
对于问题 2,这实际上是针对您的应用程序的。如果只有您的应用程序更新数据库,那么您知道何时使缓存失效。如果数据库在外部更新,您必须让该系统知道您的应用程序——或者至少是缓存——以便它可以发送失效。
有多种方法可以将缓存与数据库同步,但这取决于您使用的缓存。
在分布式缓存中,以下是保证缓存数据有效的方法。
- 使用过期(仍然不能保证数据有效性)(Redis 支持的功能,
NCache、Apache Ignite...)
- 使用SQL,Oracle依赖(NCache支持的功能)
- 使用基于 Cosmos 和 mongo 通知的自定义依赖项提供数据库更改通知(NCache 支持的功能)
我们有定期更新的数据库。我正在使用 ehcache 和 mysql 数据库。
现在,一旦数据库更新,我们需要根据更新从数据库中提取一些信息并将其发布到缓存中。
- 我应该如何使我的数据库与缓存保持同步(缓存应该随着数据库的更新而更新)?
- 我怎么知道数据库何时更新?
这是缓存引入的经典问题。在复制数据的那一刻 - 在数据库和缓存中 - 你会引入一致性问题。
此问题没有单一答案。
对于 1,答案取决于防止从缓存中提供陈旧数据的重要性。在某些情况下,这不是问题,使用较短的到期时间即可解决问题。在其他情况下,您必须在缓存中拥有最新数据,然后您必须确保缓存的条目无效。
请注意,以完全安全的方式执行此操作很难,这就是为什么 Hibernate has so many second level cache strategies 越来越安全,但也越来越慢。
对于问题 2,这实际上是针对您的应用程序的。如果只有您的应用程序更新数据库,那么您知道何时使缓存失效。如果数据库在外部更新,您必须让该系统知道您的应用程序——或者至少是缓存——以便它可以发送失效。
有多种方法可以将缓存与数据库同步,但这取决于您使用的缓存。 在分布式缓存中,以下是保证缓存数据有效的方法。
- 使用过期(仍然不能保证数据有效性)(Redis 支持的功能, NCache、Apache Ignite...)
- 使用SQL,Oracle依赖(NCache支持的功能)
- 使用基于 Cosmos 和 mongo 通知的自定义依赖项提供数据库更改通知(NCache 支持的功能)