memcached: что быстрее, делает сложение (и проверяет результат) или делает get (и устанавливается при возврате false) - PullRequest
6 голосов
/ 21 апреля 2010

Название этого вопроса не так понятно, но код и вопрос просты.

Допустим, я хочу показывать своим пользователям рекламу один раз в день. Для этого каждый раз, когда они посещают страницу на моем сайте, я проверяю, хранятся ли на определенном ключе memcache какие-либо данные. Если это так, не показывать рекламу. Если нет, сохраните значение «1» в этом ключе с истечением 86400.

Я могу сделать это 2 способами:

//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. Однако, каковы издержки «добавить» против «получить»? Это не реальные сравнения ... и я просто составил эти числа, но скажем, 1 добавить ~ = 1 набор ~ = 5 получают с точки зрения усилий, а средний пользователь просматривает 5 страниц в день:

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

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

Имеет ли смысл всегда делать вызов add? Это ненужная микрооптимизация?

Ответы [ 2 ]

3 голосов
/ 21 апреля 2010

Вот какой-то быстрый и грязный код, который я написал для проверки этого, если кому-то интересно:

<?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);
}
0 голосов
/ 11 мая 2010

Если вы знаете, что ключ существует, вероятно, будет быстрее выполнить операцию приращения и посмотреть на результаты. Это похоже на проблемы ограничения скорости и регулирования, с которыми сталкиваются люди; возможно, вы могли бы создать хороший поиск в Google, зная это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...