我正在尝试构建一个Java应用程序,它将在Memcached中设置数据,并在稍后的过程中有一个PHP脚本来获取相同的数据。到目前为止,我还没有找到一个获得100%命中率的方法。为了确保集合没有问题,我手动确认数据被添加到Memcached中。基于PHP和Java中的一致散列,我尝试使用KETAMA (请参阅下面的代码),但没有成功。
组合:
在Java和PHP之间共享数据的最佳策略是什么?是否有我没有正确使用的配置?我应该用另一个图书馆吗?
谢谢你的帮助!
MemcachedClient client = new MemcachedClient
(ConnectionFactory) new ConnectionFactoryBuilder ()
.setProtocol (Protocol.TEXT)
.setHashAlg (DefaultHashAlgorithm.KETAMA_HASH)
.setFailureMode (FailureMode.Redistribute)
.setLocatorType (Locator.CONSISTENT).build(),
AddrUtil.getAddresses("192.168.0.101:11211 192.168.0.102:11211"));
$memcached = new Memcached();
$memcached->addserver('192.168.0.101', 11211);
$memcached->addserver('192.168.0.102', 11211);
$memcached->setOption(Memcached::OPT_DISTRIBUTION ,Memcached::DISTRIBUTION_CONSISTENT);
$memcached->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
发布于 2012-07-12 08:32:46
在spymemcached中,据报道有一个带有KETAMA散列算法的问题。它指的是2.5rc1版本,但似乎仍然会发生这种情况。
尝试另一个java客户机:xmemcached。
发布于 2012-07-13 13:17:46
对于那些想做同样事情的人来说,有一个更好的策略。Twitter提供了双代理 (胡桃夹子),它是memcached的一个快速而轻量级的代理。使用它,我不必担心如果Java和PHP使用相同的散列algo,代理会处理这个问题。
发布于 2015-10-12 02:41:38
我也遇到了这个问题。经过几个小时的调查,我发现这是因为在PHP和Java客户机中定义的flags
不同。
我用xmemcached让它工作。
首先,创建一个新的StringTranscoder
来解码响应,忽略标志定义并将所有标志转换为String
。
/**
*
* Php memcached extension uses flags=0 or 1 for all SET values, the default StringTranscoder in Xmemcached uses 0 for string
*
*/
class PhpStringTranscoder extends PrimitiveTypeTranscoder<String> {
private String charset = BaseSerializingTranscoder.DEFAULT_CHARSET;
public PhpStringTranscoder(String charset) {
this.charset = charset;
}
public PhpStringTranscoder() {
this(BaseSerializingTranscoder.DEFAULT_CHARSET);
}
public String decode(CachedData d) {
String rv = null;
try {
if (d.getData() != null) {
rv = new String(d.getData(), this.charset);
}
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
return rv;
}
public static final int STRING_FLAG = 1;
public CachedData encode(String o) {
byte[] b;
try {
b = o.getBytes(this.charset);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
return new CachedData(STRING_FLAG, b);
}
}
最后,使用这个新的PhpStringTranscoder
创建会话:
MemcachedClientBuilder builder = new XMemcachedClientBuilder(String.format("%s:%s",address,portNum));
builder.setCommandFactory(new TextCommandFactory());
builder.setTranscoder(new PhpStringTranscoder());
builder.setSessionLocator(new LibmemcachedMemcachedSessionLocator(100, HashAlgorithm.ONE_AT_A_TIME));
MemcachedClient memcachedClient = builder.build();
memcachedClient
是您应该使用的。
https://stackoverflow.com/questions/11440681
复制相似问题