Java 在不同服务器中维护缓存状态

Java 在不同服务器中维护缓存状态,java,caching,Java,Caching,这可能是一个愚蠢的问题,但我甚至都不知道谷歌在做什么。 我有一个服务器,它从数据库中获取一些数据,缓存这些数据,当任何请求都涉及这些数据时,就从缓存中而不是从数据库中获取数据。 此缓存可以修改,也就是说,某些密钥可能会被添加到缓存中,或者被删除或更新。 缓存中发生的任何更改也将发生在DB上。 现在的问题是由于流量激增,我们想在我的服务器前面添加一个负载平衡器。假设我再添加一个服务器。然后这两台服务器将有两个不同的缓存。如果在第一个服务器缓存中添加了某些内容,我应该如何通知第二个服务器缓存使其刷新

这可能是一个愚蠢的问题,但我甚至都不知道谷歌在做什么。 我有一个服务器,它从数据库中获取一些数据,缓存这些数据,当任何请求都涉及这些数据时,就从缓存中而不是从数据库中获取数据。 此缓存可以修改,也就是说,某些密钥可能会被添加到缓存中,或者被删除或更新。 缓存中发生的任何更改也将发生在DB上。
现在的问题是由于流量激增,我们想在我的服务器前面添加一个负载平衡器。假设我再添加一个服务器。然后这两台服务器将有两个不同的缓存。如果在第一个服务器缓存中添加了某些内容,我应该如何通知第二个服务器缓存使其刷新??

您喜欢的任何方式;)如果您不知道,我建议您查看或使用ehcache或Hazelcast。它可能不是您的最佳解决方案,但却是应用最广泛的解决方案之一。(和CV++;)我建议您首先了解它的功能。

如果您最终决定将缓存移到主Web服务器进程之外,那么您也可以查看一下。这将是复制缓存的替代方案

复制缓存的问题在于,它们的规模与参与缓存的节点数成反比。i、 e.当您添加额外的节点时,它们的性能会下降。当节点数量较少时,它们可以正常工作。如果要在N个节点之间复制数据(或者需要向N个节点发送逐出消息),则每次写入都需要对原始节点上的缓存进行1次写入,并对其他节点进行N-1次写入

在一致性哈希中,您可以定义一个哈希函数,该函数将要存储或检索的数据的键作为输入,并返回集群中负责缓存该键数据的服务器的id。因此,每个缓存服务器只负责总密钥的一小部分,客户端可以在不进行任何查找的情况下确定哪个服务器将包含所查找的数据,并且不需要在缓存服务器之间复制数据和逐出消息

一致散列的“一致性”部分指的是散列函数如何处理添加到集群或从集群中删除的新服务器:需要在服务器之间重新分配密钥,但该函数旨在将此类中断的数量降至最低

实际上,您实际上不需要专用的缓存集群,因为缓存可以在web服务器中运行;每个web服务器都能够确定应该存储密钥缓存数据的其他web服务器

大规模使用一致散列。在这个阶段对你来说可能太过分了。但请注意O(N)消息传递体系结构中固有的可伸缩性瓶颈。从复制缓存开始可能是个好主意

编辑:看一看分布式缓存,它确实使用了一致的开箱即用散列