我有一个基于danga客户端的旧memcached客户端实现,但略有修改。我认为这个客户现在被称为Memcached-Java-客户机。
我手头的实现是旧的,没有维护的,而且似乎是假的。
我需要将客户机迁移到具有以下约束的较新客户端:
当前的实现使用一致的散列算法,该算法似乎与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,但无法使它与我当前的客户端兼容。下面是我的间谍缓存客户端初始化代码:
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"));发布于 2011-01-16 10:27:49
我的旧danga客户端似乎与Xmemcached/Spymemcached客户机不兼容,原因很简单: danga客户机散列主机:端口字符串,而后面的客户机散列InetSocketAddress,这实际上等于主机/IP:端口。
由于这个事实,我无法在迁移到较新的客户端时保持兼容。实际上,Xmemcached客户端和Spymemcached客户端都是可扩展的,并且允许在实现这一点方面提供一些支持,但是这样做对我的偏好来说太“烦人”了。
我决定要做的是迁移我的代码,根据基准测试结果使用Xmemcached/Spymemcached中的一个。这两种算法都与moxi的哈希算法兼容。我最终可能只使用客户端moxi -取决于它将增加的开销。我最喜欢这个选项,因为它使应用程序配置更加简单。
发布于 2011-01-12 20:27:28
按照我的理解,您将遇到与使用间谍缓存的xmemcached相同的问题。正如我前面提到的- http://bugs.membase.org/browse/MB-1484,您现在使用的一致散列是加权一致散列,而不是其他2,这就是为什么您缺少一些键。
https://stackoverflow.com/questions/4672284
复制相似问题