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

时间:2011-01-12 18:08:03

标签: java memcached

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

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

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

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

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

2 个答案:

答案 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 - 取决于它将添加的开销。我最喜欢这个选项,因为它使应用程序配置更加简单。