java - 如何让 xmemcached 更快

标签 java php memcached xmemcached

我有一个项目,我们正在尝试将 php 代码的主要部分转移到 java 服务中。关键部分之一是 memcached 事务。

我从 xmemcached 开始。我使用二进制协议(protocol)和 5 个连接池进行测试。我的存储桶中有 10000 个项目,我的机器本身有两个 memcached 实例。我使用 xmemcached 在 php-memcached 和 java 中点击了所有 10000 个项目。

在双方,我都使用持久连接。获得相同数量的元素。 PHP 正在通过遍历 10K 值的数组来进行一些额外的处理。结果仍然是 php 在 0.9 到 1.2 秒内完成,而 java 需要 1.6 到 2 秒。

这么长时间的延迟对于我们的项目来说是 Not Acceptable 。还可以采取哪些措施来加速 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) {

            }
        }
    }
}

最佳答案

以下是用于创建 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();
...
}
}

关于java - 如何让 xmemcached 更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20838716/

相关文章:

php - mysql_num_rows 给出错误 "mysql_num_rows() expects parameter 1 to be resource"

php - 在不使用 cas 的情况下在 Memcached 中实现原子计数器

java - 当我将扫描仪对象分配给变量时程序崩溃

php - php中如何保存文本区域的数据

Java:使用 ExecutorService 并行调用 API getList

php - Symfony2 Doctrine : How to disable mysql connection?

mysql - 同时使用 MySQL Query Cache 和 Memcached

php - Memcache产生不可阻挡的通知

java - 非 volatile 字段+来自另一个线程的第一个对象访问(java)

java - Ebean 在查询中使用 And