Java 使用SpymeMached时如何处理恢复memcached节点&;HashAlgorithm.KETAMA_哈希

Java 使用SpymeMached时如何处理恢复memcached节点&;HashAlgorithm.KETAMA_哈希,java,memcached,spymemcached,consistent-hashing,Java,Memcached,Spymemcached,Consistent Hashing,我正在使用spymecached&HashAlgorithm.KETAMA_散列连接到一个由5个节点组成的memcached池 我的理解是,当我们使用一致的散列算法时,比如,当一个节点关闭时,我们不需要担心,因为密钥将被重新分配(影响最小) 如果关闭的节点要加入池,该怎么办。我需要做什么 我是否应该确保需要删除过时的数据?或者我的程序是否需要对这种情况进行特殊处理?鉴于此文档是准确的: 如果出现任何网络中断,并且一个或多个客户端决定 memcached服务器不再可用,它们将自动将一些数据重新缓存

我正在使用spymecached&HashAlgorithm.KETAMA_散列连接到一个由5个节点组成的memcached池

我的理解是,当我们使用一致的散列算法时,比如,当一个节点关闭时,我们不需要担心,因为密钥将被重新分配(影响最小)

如果关闭的节点要加入池,该怎么办。我需要做什么


我是否应该确保需要删除过时的数据?或者我的程序是否需要对这种情况进行特殊处理?

鉴于此文档是准确的:

如果出现任何网络中断,并且一个或多个客户端决定 memcached服务器不再可用,它们将自动将一些数据重新缓存到 剩余的节点,即使原始节点仍然可用。如果节点最终恢复服务(例如,在解决网络中断后),则该节点上的数据将过期,并且没有更新密钥服务器重新映射信息的客户端将读取过时数据

假设这仍然是最新的:
在重新添加节点之前,刷新/刷新节点是安全的。强制已关闭的节点清除任何过时条目

我的理解是我必须刷新所有节点中的所有过时数据。为什么?因为有些客户端可能会看到已关闭的节点已打开,但有些客户端可能仍然认为该节点已关闭。因此,考虑到客户端可能会将密钥散列到不同的节点,数据可能会不一致。但这个问题很难解决,除非我们有办法锁定所有memcached节点并执行刷新-以避免竞争条件。根据我的意见,我认为只刷新已关闭的节点仍然是安全的。它是干净的,如果有任何对节点的请求,它将导致未命中,添加新的和新鲜的信息。如果客户端认为它已关闭,它将散列到另一个节点,也会导致未命中。如果发生这种情况,则两个节点都有键'foo'。当关闭的节点重新联机到该客户端时,您需要再次刷新它。这里有更多关于这一点的信息:是的,但是你所说的只有当你有一个单一的客户端但有多个服务器时才有效。无法协调不同的客户端在给定时间使用同一组memcached服务器(假设使用一致哈希)。