【发布时间】:2012-07-11 20:11:37
【问题描述】:
我正在尝试构建一个 Java 应用程序,该应用程序将在 Memcached 中设置数据,并有一个 PHP 脚本来稍后在此过程中获取相同的数据。到目前为止,我还没有找到获得 100% 命中率的方法。为了确保 SET 没有任何问题,我手动确认数据已添加到 Memcached。基于Consistent hashing in PHP and Java,我尝试使用KETAMA(见下面的代码)但没有成功。
配置:
- Spymemcached (2.8.1)
- PHP (5.3.10)
- PECL/memcached (2.0.1)
- libmemcached (1.0.4)
在 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);
【问题讨论】:
-
对于我的测试,我使用“test_1”到“test_1000”
-
你是说 php 客户端和 java 客户端返回不同的键值?
-
PHP 只会返回“false”,因为它无法根据给定的键找到值。它适用于 30% 的 GET,但我认为这只是因为我只有两台服务器,幸运的是它可以从正确的服务器查询。
-
你确定你对两个客户端使用相同的哈希算法吗?
-
我尝试过:PHP > Memcached::HASH_FNV1A_32 和 Java > DefaultHashAlgorithm.FNV1A_32_HASH。我还尝试了 PHP > Memcached::HASH_FNV1A_64 和 Java > DefaultHashAlgorithm.FNV1A_64_HASH。我终于尝试使用 PHP > Memcached::HASH_CRC 和 Java > DefaultHashAlgorithm.CRC_HASH。