Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有分布式失效的本地缓存(Java/Spring)_Java_Spring_Spring Boot_Caching_Spring Cache - Fatal编程技术网

具有分布式失效的本地缓存(Java/Spring)

具有分布式失效的本地缓存(Java/Spring),java,spring,spring-boot,caching,spring-cache,Java,Spring,Spring Boot,Caching,Spring Cache,分布式缓存的一个缺点是,每个缓存查询(命中或未命中)都是一个网络请求,显然永远不会像本地内存缓存那样快。为了避免缓存重复、数据不一致和缓存大小限制,这通常是一个值得权衡的问题。在我的特殊情况下,我只关心数据的不一致性。缓存数据的大小相当小,应用程序服务器的数量也足够小,因此填充重复缓存所需的额外数据库负载不会太大。我真的很想拥有本地缓存的速度(和更低的复杂性),但我的数据集确实会被同一个应用程序每天更新大约50次。这意味着,当发生这些写入操作时,这些应用程序服务器中的每一个都需要知道如何使其本地

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


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

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


JBossCache本身不是spring组件,但是您创建并使用缓存作为Springbean应该不会有问题。

AFIAK Infinispan还支持复制模式。我们还在我们的应用程序中构建了数据库方法,如您所描述的,并在其之上构建了超快速的本地访问。我可以和大家分享,不过我需要一点时间先把它变成通用的。谢谢,@cruftex。查看Infinispan的文档,我发现它确实有一个近缓存模式来支持本地访问,但从我所知,它仍然需要一个缓存服务器,如果可能的话,我希望避免使用。我将研究您使用cache2k的方法。如果我陷入困境,我可能会与你分享代码。谢谢你!