【发布时间】:2020-01-07 18:01:11
【问题描述】:
分布式缓存的一个缺点是每个缓存查询(命中或未命中)都是一个网络请求,它显然永远不会像本地内存缓存那样快。通常这是一个值得权衡的选择,以避免缓存重复、数据不一致和缓存大小限制。在我的特殊情况下,我担心的只是数据不一致。缓存数据的大小相当小,应用程序服务器的数量也足够小,数据库上填充重复缓存的额外负载不会是什么大问题。我真的很想拥有本地缓存的速度(和更低的复杂性),但是我的数据集确实由同一个应用程序每天更新大约 50 次。这意味着当这些写入发生时,这些应用程序服务器中的每一个都需要知道它们的本地缓存无效。
一个简单的方法是创建一个数据库表,其中包含一个缓存键列和一个数据最后更新时间的时间戳。应用程序可以查询该表以确定它是否需要使其本地缓存过期。是的,这也是一个网络请求,但它比通过网络传输整个缓存数据集要快得多。在我去构建一些自定义的东西之前,是否有现有的 Java/Spring 缓存产品可以配置为以这种方式工作?有没有我没有想到的问题?请注意,这不是必须在事务上保持一致的数据。如果应用服务器有几秒钟的时间不同步,那也不是问题。
【问题讨论】:
-
AFIAK Infinispan 也支持复制模式。正如您所描述的那样,我们还在我们的应用程序中构建了数据库方法,并在其之上使用了cache2k,以实现超快速的本地访问。我可以分享一下,虽然我需要一点时间先让它通用。
-
谢谢,@cruftex。查看 Infinispan 的文档,我发现它确实有一个近缓存模式来支持本地访问,但据我所知,它仍然需要一个缓存服务器,如果可能的话我想避免使用它。我将研究您使用 cache2k 的方法。如果我遇到困难,我可能会在代码共享方面与您联系。欣赏!
标签: java spring spring-boot caching spring-cache