【问题标题】:Local Cache with Distributed Invalidation (Java/Spring)具有分布式失效的本地缓存 (Java/Spring)
【发布时间】:2020-01-07 18:01:11
【问题描述】:

分布式缓存的一个缺点是每个缓存查询(命中或未命中)都是一个网络请求,它显然永远不会像本地内存缓存那样快。通常这是一个值得权衡的选择,以避免缓存重复、数据不一致和缓存大小限制。在我的特殊情况下,我担心的只是数据不一致。缓存数据的大小相当小,应用程序服务器的数量也足够小,数据库上填充重复缓存的额外负载不会是什么大问题。我真的很想拥有本地缓存​​的速度(和更低的复杂性),但是我的数据集确实由同一个应用程序每天更新大约 50 次。这意味着当这些写入发生时,这些应用程序服务器中的每一个都需要知道它们的本地缓存无效。

一个简单的方法是创建一个数据库表,其中包含一个缓存键列和一个数据最后更新时间的时间戳。应用程序可以查询该表以确定它是否需要使其本地缓存过期。是的,这也是一个网络请求,但它比通过网络传输整个缓存数据集要快得多。在我去构建一些自定义的东西之前,是否有现有的 Java/Spring 缓存产品可以配置为以这种方式工作?有没有我没有想到的问题?请注意,这不是必须在事务上保持一致的数据。如果应用服务器有几秒钟的时间不同步,那也不是问题。

【问题讨论】:

  • AFIAK Infinispan 也支持复制模式。正如您所描述的那样,我们还在我们的应用程序中构建了数据库方法,并在其之上使用了cache2k,以实现超快速的本地访问。我可以分享一下,虽然我需要一点时间先让它通用。
  • 谢谢,@cruftex。查看 Infinispan 的文档,我发现它确实有一个近缓存模式来支持本地访问,但据我所知,它仍然需要一个缓存服务器,如果可能的话我想避免使用它。我将研究您使用 cache2k 的方法。如果我遇到困难,我可能会在代码共享方面与您联系。欣赏!

标签: java spring spring-boot caching spring-cache


【解决方案1】:

我不知道以您指定的方式查询数据库的任何实现。确实存在的解决方案是将本地缓存中的更改分布在组中的成员之间。 JBossCache 是一个示例,您还可以选择仅分发对象失效。这可能是最接近您所追求的。

https://access.redhat.com/documentation/en-us/jboss_enterprise_application_platform/4.3/html/cache_frequently_asked_questions/tree_cache#a19

JBossCache 本身并不是一个 spring 组件,但是你创建一个缓存并将其用作 spring bean 应该不是问题。

【讨论】:

    猜你喜欢
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2022-08-08
    • 1970-01-01
    • 2014-02-28
    • 2019-06-12
    • 1970-01-01
    相关资源
    最近更新 更多