首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java (spymemcached)和PHP (memcached)

Java (spymemcached)和PHP (memcached)
EN

Stack Overflow用户
提问于 2012-07-11 20:11:37
回答 3查看 1.9K关注 0票数 0

我正在尝试构建一个Java应用程序,它将在Memcached中设置数据,并在稍后的过程中有一个PHP脚本来获取相同的数据。到目前为止,我还没有找到一个获得100%命中率的方法。为了确保集合没有问题,我手动确认数据被添加到Memcached中。基于PHP和Java中的一致散列,我尝试使用KETAMA (请参阅下面的代码),但没有成功。

组合:

  • Spymemcached (2.8.1)
  • PHP (5.3.10)
  • PECL/memcached (2.0.1)
  • libmemcached (1.0.4)

在Java和PHP之间共享数据的最佳策略是什么?是否有我没有正确使用的配置?我应该用另一个图书馆吗?

谢谢你的帮助!

代码语言:javascript
运行
复制
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"));
代码语言:javascript
运行
复制
$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);
EN

回答 3

Stack Overflow用户

发布于 2012-07-12 08:32:46

在spymemcached中,据报道有一个带有KETAMA散列算法的问题。它指的是2.5rc1版本,但似乎仍然会发生这种情况。

尝试另一个java客户机:xmemcached

票数 0
EN

Stack Overflow用户

发布于 2012-07-13 13:17:46

对于那些想做同样事情的人来说,有一个更好的策略。Twitter提供了双代理 (胡桃夹子),它是memcached的一个快速而轻量级的代理。使用它,我不必担心如果Java和PHP使用相同的散列algo,代理会处理这个问题。

票数 0
EN

Stack Overflow用户

发布于 2015-10-12 02:41:38

我也遇到了这个问题。经过几个小时的调查,我发现这是因为在PHP和Java客户机中定义的flags不同。

我用xmemcached让它工作。

首先,创建一个新的StringTranscoder来解码响应,忽略标志定义并将所有标志转换为String

代码语言:javascript
运行
复制
/**
 *
 * 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创建会话:

代码语言:javascript
运行
复制
    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是您应该使用的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11440681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档