【发布时间】:2011-06-08 00:30:56
【问题描述】:
我有一个基于 danga 客户端的旧 memcached 客户端实现,但稍作修改。我想这个客户现在叫Memcached-Java-Client。
我手头的实现是旧的、未维护的,而且似乎是伪造的。
我需要将客户端迁移到具有以下约束的较新客户端:
- 我需要新的客户端哈希算法与旧的兼容。如果不满足此限制条件,我们将不得不让网站(至少部分)在几个小时内不可用。
- 支持各种序列化方法,并允许序列化方法的可扩展性。
- 比我现有的客户提高了性能。
- 兼容Moxi
当前的实现使用一致的散列算法,它似乎与Xmemcached 使用的一致散列兼容,除了我无法获得旧客户端存储并使用 Xmemcached 客户端获取的键的缓存命中。
我调试了代码,得到了相同的hashcode,但是我觉得server ring不一样,所以整体的hash方式不一样。
这是我用来初始化 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 不太感兴趣? moxi 的作者和 spymemcached (me) 的作者大部分时间都坐在同一个房间里,我们做了很多工作。但更重要的是,您的所有要求都是 spymemcached 的目标,而且我们有付费开发人员和开源贡献者也在从事 memcached 本身的工作。
-
这是一个很好的输入@Dustin。我不知道这个输入。我看到 xmemcached 的作者完成的一些基准测试显示了更好的结果 + 它是多线程的这一事实让我认为它在重负载下会表现得更好。我仍然没有验证这个假设,仍然需要满足我的其他要求。我还想看看哪个 API 更吸引人。
-
@Dustin,spymemcached 一致性哈希算法是否与 danga 兼容?
-
xmemcached 已显示出边际速度提升。当然,它并不慢。这样做的人很晚才开始,并且有一张白纸可以使用,这是一个令人羡慕的职位。我对 Whalin 的客户端做了类似的事情,并且必须提供与它的兼容性,这导致了我的一些模块化。你应该可以把它换进去。但是,我们正在为下一代缩放模型和其他有趣的东西做a lot of work。