Java 如何使xmemcached更快
我有一个项目,我们试图将php代码的主要部分转移到java服务中。其中一个关键部分是memcached事务 我从xmemcached开始。我正在使用二进制协议和5的连接池进行测试。我的bucket中有10000个条目,在我的机器上有两个memcached实例。我使用xmemcached在php memcached和java中访问了所有10000项 在这两方面,我都使用持久连接。获得相同数量的项目。PHP正在做一些额外的处理,通过遍历10K值的数组。结果仍然是php只需0.9到1.2秒,java只需1.6到2秒Java 如何使xmemcached更快,java,php,memcached,xmemcached,Java,Php,Memcached,Xmemcached,我有一个项目,我们试图将php代码的主要部分转移到java服务中。其中一个关键部分是memcached事务 我从xmemcached开始。我正在使用二进制协议和5的连接池进行测试。我的bucket中有10000个条目,在我的机器上有两个memcached实例。我使用xmemcached在php memcached和java中访问了所有10000项 在这两方面,我都使用持久连接。获得相同数量的项目。PHP正在做一些额外的处理,通过遍历10K值的数组。结果仍然是php只需0.9到1.2秒,java只
如此多的延误对我们的项目来说是不可接受的。为了加速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";
$mem=newmemcached(“p”);
如果(count($mem->getServerList())addServer(“10.90.15.104”,11211);
$mem->addServer(“10.90.15.104”,11311);
}
对于($j=0;$j$val){
$val2=$val;
如果($val2!=''){
$count++;
}
}
$endTime=微时间(真);
文件内容(“/tmp/time.log”($endTime-$startTime)。“\n”,文件附加);
//回显“计数>>$count\n”;
//回显“所用时间:”($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) {
}
}
}
}
导入AxMemcached.Adfeed;
导入AxMemcached.AxMemcachedClientFactory;
导入java.util.Calendar;
导入net.rubyye.xmemcached.MemcachedClient;
公共类BigGet2{
公共静态void main(字符串[]args){
BigGet2 self=新的BigGet2();
对于(int j=0;j<1000;j++){
Long timeStart=Calendar.getInstance().getTimeInMillis();
字符串值=”;
试一试{
MemcachedClientBuilder=new XMemcachedClientBuilder(
net.rubyye.xmemcached.utils.AddrUtil.getAddresses(“10.90.15.104:11211 10.90.15.104:11311”);
builder.setConnectionPoolSize(10);
setCommandFactory(新的BinaryCommandFactory());
setSessionLocator(新的ArraymeCachedSessionLocator(net.rubyye.xmemcached.HashAlgorithm.ONE_AT_A_TIME));
MemcachedClient MemcachedClient=builder.build();
对于(int i=1;i以下是用于创建memcached连接的单例设计模式。如果您的应用程序客户端为每个请求创建一个新连接,那么您将在JVM中看到每个连接有大量线程,这将消耗大量内存,从而导致过多的垃圾收集,从而降低应用程序的速度
@Singleton
public class MemcacheConnectionManager {
public MemcachedClient clientBuilder() throws IOException {
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
AddrUtil.getAddresses("localhost:11211"));
builder.setConnectionPoolSize(5);
MemcachedClient cacheClient = builder.build();
return cacheClient;
}
}
public class memcacheconsumer{
..
someCacheConsumerMethod(){
..
if(memcachedClient==null)
memcachedClient = memcacheConnection.clientBuilder();
...
}
}
“这么多的延迟对我们的项目来说是不可接受的。我们还能做些什么来加快xmemcached?”不使用Java?在这里寻找答案,而不是讽刺