将Memcached客户端从Memcached-Java-Client迁移到Xmemcached

我有一个旧的memcached客户端实现,它基于danga客户端,但稍作修改。 我认为这个客户端现在称为Memcached-Java-Client 。

我手边的实现是陈旧的,没有维护,似乎是虚假的。

我需要将客户端迁移到具有以下约束的较新客户端:

  1. 我需要新的客户端散列算法与旧的兼容。 如果不满足此约束,我们将不得不使网站(至少部分)不可用几个小时。
  2. 支持各种序列化方法,并允许序列化方法的可扩展性。
  3. 改进了现有客户端的性能。
  4. 与Moxi兼容

当前实现使用一致的散列算法,该算法似乎与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")); 

我理解你的方式与使用spymemcached的xmemcached中的问题相同。 正如我之前在这里指出的那样 – http://bugs.membase.org/browse/MB-1484 ,你现在使用的是一致哈希,它是加权一致哈希而不是其他2,这就是为什么你缺少一些键。

看起来我的旧danga客户端与Xmemcached / Spymemcached客户端不兼容,原因很简单:danga客户端哈希主机:端口字符串,而后来的客户端哈希InetSocketAddress实际上等于host / IP:port。

由于这一事实,我无法在迁移到较新的客户端时保持兼容。 好吧,实际上,Xmemcached和Spymemcached客户端都有一定程度的可扩展性并且允许一些支持来实现这一点,但这样做对我的偏好来说太“笨拙”了。

我决定根据基准测试结果迁移我的代码以使用Xmemcached / Spymemcached中的一个。 两者都与moxi的哈希算法兼容。 我最终可能最终只使用客户端moxi – 取决于它将添加的开销。 我最喜欢这个选项,因为它使应用程序配置更加简单。