我有一个项目,我们正在尝试在 java 服务中转换 php 代码的主要部分。关键部分之一是 memcached 事务。
我从 xmemcached 开始。我正在使用二进制协议和 5 的连接池进行测试。我的存储桶中有 10000 个项目,我的机器本身上有两个 memcached 实例。我使用 xmemcached 在 php-memcached 和 java 中点击了所有 10000 个项目。
在双方,我都在使用持久连接。获得相同数量的项目。PHP 正在做一些额外的处理,通过遍历 10K 值的数组。结果仍然是 php 在 0.9 到 1.2 秒内完成,而 java 需要 1.6 到 2 秒。
对于我们的项目来说,这么大的延迟是不可接受的。还可以做些什么来加速 xmemcached?请帮忙
这是php代码:
$mem = new Memcached("p");
if(count($mem->getServerList()) <= 0) {
$mem->addServer("10.90.15.104",11211);
$mem->addServer("10.90.15.104",11311);
}
for($j=0; $j<1000; $j++) {
$startTime = microtime(true);
$memVals = array();
for($i=1; $i<=10000; $i++) {
$memVals[$i] = $mem->get($i);
}
$count=0;
foreach($memVals as $key=>$val) {
$val2 = $val;
if($val2 != '') {
$count++;
}
}
$endTime = microtime(true);
file_put_contents("/tmp/time.log",($endTime-$startTime)."\n",FILE_APPEND);
//echo "count>>$count\n";
//echo "time taken: ".($endTime-$startTime)."\n";
这是java代码:
import AxMemcached.Adfeed;
import AxMemcached.AxMemcachedClientFactory;
import java.util.Calendar;
import net.rubyeye.xmemcached.MemcachedClient;
public class BigGet2 {
public static void main(String[] args) {
BigGet2 self = new BigGet2();
for (int j = 0; j < 1000; j++) {
Long timeStart = Calendar.getInstance().getTimeInMillis();
String value = "";
try {
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
net.rubyeye.xmemcached.utils.AddrUtil.getAddresses("10.90.15.104:11211 10.90.15.104:11311"));
builder.setConnectionPoolSize(10);
builder.setCommandFactory(new BinaryCommandFactory());
builder.setSessionLocator(new ArrayMemcachedSessionLocator(net.rubyeye.xmemcached.HashAlgorithm.ONE_AT_A_TIME));
MemcachedClient memcachedClient = builder.build();
for (int i = 1; i <= 10000; i++) {
value = memcachedClient.get(Integer.toString(i));
memcachedClient.get(Integer.toString(i));
}
Long timeEnd = Calendar.getInstance().getTimeInMillis();
Long timeTaken = timeEnd - timeStart;
System.out.println(timeTaken);
} catch (Exception e) {
}
}
}
}