首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使xmemcached更快

如何使xmemcached更快
EN

Stack Overflow用户
提问于 2013-12-30 19:35:14
回答 1查看 800关注 0票数 0

我有一个项目,在这个项目中,我们试图在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代码如下:

代码语言:javascript
复制
$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代码:

代码语言:javascript
复制
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) {

            }
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2014-11-27 07:43:22

下面是一个创建memcached连接的单例设计模式。如果您的应用程序客户端为每个请求创建一个新连接,那么您将在JVM中看到每个连接都有大量线程,这将消耗大量内存,从而导致过多的垃圾回收,从而减慢您的应用程序。

代码语言:javascript
复制
@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();
...
}
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20838716

复制
相关文章

相似问题

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