optimization - memcached:哪个更快,执行添加(并检查结果),或执行获取(并在返回 false 时设置)

标签 optimization memcached

这个问题的标题不太清楚,但是代码和问题很简单。

假设我想每天向用户展示一次广告。为了实现这一目标,每次他们访问我网站上的页面时,我都会检查某个内存缓存键上是否存储了任何数据。如果是这样,请不要展示广告。如果不是,则在该 key 中存储值“1”,过期时间为 86400。

我可以通过两种方式做到这一点:

//version a
$key='OPD_'.date('Ymd').'_'.$type.'_'.$user;
if($memcache->get($key)===false){
 $memcache->set($key,'1',false,$expire);
 //show ad
}

//version b
$key='OPD_'.date('Ymd').'_'.$type.'_'.$user;
if($memcache->add($key,'1',false,$expire)){
 //show ad
}

现在,b 似乎明显更好,它总是进行 1 个 memcache 调用。 但是,“add”与“get”的开销是多少?这些不是真正的比较...我只是编造了这些数字,但假设 1 add ~= 1 set ~= 5 的努力,平均用户每天浏览 5 个页面:

a: (5 get * 1 effort) + (1 set * 5 effort) = 10 units of effort

b: (5 add * 5 effort) = 25 units of effort

总是进行添加调用有意义吗?这是不必要的微优化吗?

最佳答案

如果有人感兴趣的话,这是我为了测试这个而编写的一些快速而肮脏的代码:

<?php
require('include.php');
$memcache = new Memcache();

foreach(Config::$CONFIG['memcache_server'] as $memcache_server){
    $memcache->addServer($memcache_server,11211,false);
}

$iterations = 300;
$max_pages_per_visit = 25;

$time_now = microtime(true);
for($pages_per_visit = 1; $pages_per_visit<=$max_pages_per_visit; $pages_per_visit++){
    foreach(array('gs','a') as $method){
        $start = microtime(true);
        for($x = 0; $x < $iterations; $x++){
            $key = 'testmc'.$time_now.'_'.$pages_per_visit.'_'.$method.'_'.$x;
            switch($method){
                case 'gs':
                    for($y = 0 ; $y < $pages_per_visit; $y++){
                        if($memcache->get($key)===false){
                            $memcache->set($key,'1',null,5);
                        }
                    }
                    break;
                case 'a':
                    for($y = 0 ; $y < $pages_per_visit; $y++){
                        $memcache->add($key,'1',null,5);
                    }
                    break;
            }
        }
        $end = microtime(true);
        $results[$pages_per_visit][$method] = $end - $start;
    }
}

//print results
print('<pre>');
foreach($results as $pages_per_visit => $data){
    $speed_diff = $data['gs'] - $data['a'];
    $speed_percentage = round($speed_diff / $data['gs'] * 100,2);
    echo($pages_per_visit.' pages : add is faster by :'.$speed_diff.' ('.$speed_percentage.')%'.PHP_EOL);
}

关于optimization - memcached:哪个更快,执行添加(并检查结果),或执行获取(并在返回 false 时设置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2678339/

相关文章:

php - REST 服务和内存缓存

memcached - 可扩展对象的键值存储

optimization - 这种简单优化的机器学习算法是什么?

c++ - 什么是复制省略和返回值优化?

javascript - 如何测试现有的Angularjs整体性能(DOM渲染)?

php - 使用 Or-Tools 的车辆路径问题 - 自动决定初始起点

Android 退出时清除图像内存缓存

python - 从内存缓存中读取数据有时会失败

zend-framework - 用于 Memcache 的 Zend_Session SaveHandler

python - 使用 Python 在内存中分配大数组