我有一个旧的memcached客户端实现,它基于danga客户端,但稍作修改。我认为此客户端现在称为Memcached-Java-Client。
我手边的实施是陈旧的,没有维护,似乎是虚假的。
我需要将客户端迁移到具有以下约束的较新客户端:
当前实现使用一致的散列算法,该算法似乎与Xmemcached使用的一致性散列兼容,除了我无法获取旧客户端存储的密钥的缓存命中并使用Xmemcached客户端获取
我调试了代码,并且得到了相同的哈希码,但我认为服务器环不同,因此整体哈希方法不同。
这是我用于初始化xmemcached客户端的代码:
final MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("server:11211 server:11212 server:11213 server:11214"));
builder.setCommandFactory(new BinaryCommandFactory());
builder.setSessionLocator(new KetamaMemcachedSessionLocator());
builder.setTranscoder(new WhalinTranscoder());
memcachedClient = builder.build();
如果我无法让xmemcached工作,我也愿意尝试spymemcached,但我更喜欢后者。
编辑: 我也尝试了spymemcached,并且无法让它与我当前的客户端兼容。 这是我的spymemcached客户端初始化代码:
final ConnectionFactoryBuilder builder = new ConnectionFactoryBuilder();
builder.setProtocol(Protocol.BINARY);
builder.setTranscoder(WhalinTranscoder());
builder.setHashAlg(HashAlgorithm.KETAMA_HASH);
builder.setLocatorType(Locator.CONSISTENT);
final MemcachedClient client = MemcachedClient(builder.build(), AddrUtil.getAddresses("server:11211 server:11212 server:11213 server:11214"));
答案 0 :(得分:1)
我理解你的方式与使用spymemcached的xmemcached中的问题相同。正如我之前提到的那样 - http://bugs.membase.org/browse/MB-1484,你现在使用的是一致的散列,它是一个加权的一致散列,而不是其他2,这就是你错过了一些键的原因。
答案 1 :(得分:0)
由于一个简单的原因,我的旧danga客户端似乎与Xmemcached / Spymemcached客户端不兼容: danga客户端哈希主机:端口字符串,而后来的客户端哈希InetSocketAddress,它实际上等于主机/ IP:端口。
由于这个事实,我无法在迁移到新客户端时保持兼容。好吧,实际上Xmemcached和Spymemcached客户端都有一定程度的可扩展性并且允许一些支持来实现这一点,但这样做对我的偏好来说太“hacky”。
我决定根据基准测试结果迁移我的代码以使用Xmemcached / Spymemcached中的一个。两者都与moxi的哈希算法兼容。 我最终可能最终只使用客户端moxi - 取决于它将添加的开销。我最喜欢这个选项,因为它使应用程序配置更加简单。