Должен ли я хранить массив или отдельные элементы в Memcache? - PullRequest
0 голосов
/ 29 мая 2011

Сейчас мы храним результаты некоторых запросов в Memcache.Изучив немного больше, я увидел, что многие люди сохраняют каждый отдельный элемент в Memcache.Преимущество этого состоит в том, что они могут получать эти элементы из Memcache по любому другому запросу.

Хранить массив

$key = 'page.items.20';
if( !( $results = $memcache->get($key) ) )
{
    $results = $con->execute('SELECT * FROM table LEFT JOIN .... LIMIT 0,20')->fetchAll();
    $memcache->save($results, $key, 3600);
}
...

PROS:

  • Проще

CONS:

  • Если я изменяю отдельный элемент, я должен удалить все кэши (это может быть болью)
  • У меня могут быть дублированные результаты(один и тот же элемент по разным запросам)

против

Хранить каждый элемент

$key = 'page.items.20';
if( !( $results_ids = $memcache->get($key) ) )
{
    $results = $con->execute('SELECT * FROM table LEFT JOIN .... LIMIT 0,20')->fetchAll();

    $results_ids = array();
    foreach ( $results as $result )
    {
        $results_ids[] = $result['id'];
        // if doesn't exist, save individual item
        $memcache->add($result, 'item'.$result['id'], 3600);
    }

    // save results_ids 
    $memcache->save($results_ids, $key, 3600);
}
else
{
    $results = $memcache->multi_get($results_ids);
    // get elements which are not cached
    ...
}
... 

PROS:

  • Я неодин и тот же элемент хранится дважды в Memcache
  • Проще сделать недействительными результаты по нескольким запросам (только элемент, который мы меняем)

CONS:

  • Ещесложная бизнес-логика.

Как вы думаете?Какие-нибудь другие PROS или CONS на каждом пути?

Некоторые ссылки

Ответы [ 3 ]

1 голос
/ 29 мая 2011

Захватите статистику и попробуйте рассчитать коэффициент попаданий или возможное улучшение, если вы кешируете полный запрос против выполнения отдельных захватов предметов в MC.Профилирование такого рода кода также очень полезно для понимания того, как применима ваша теория.

Это зависит от того, что делает запрос.Если у вас есть набор пользователей, а затем вы хотите захватить «10 лучших музыкальных связей» с некоторыми из этих друзей, то стоит иметь оба кэширования: - каждый друг (фактически каждый пользователь сайта) - 10 лучшихзапрос для каждого пользователя (пространство дешевле, чем процессорное время)

Но в целом стоит хранить в MC все отдельные объекты, которые будут часто использоваться (либо при выполнении того же кода, либо в последующих запросахили другими пользователями).Затем такие вещи, как загрузка ресурсов ЦП или ресурсов и обработка данных, либо MC-их, либо делегирование их асинхронным.задания вместо того, чтобы делать их в реальном времени (например, топ 10 пользователей сайта не должны быть в реальном времени, могут обновляться ежечасно или ежедневно).И, конечно, принимая во внимание, что если вы храните и MC отдельные сущности, вы должны удалить всю ссылочную целостность из БД, чтобы иметь возможность использовать их по отдельности или в группах.

0 голосов
/ 07 июня 2012

Memcached хранит данные в блоках определенного размера, как лучше объяснено в ссылке ниже.

http://code.google.com/p/memcached/wiki/NewUserInternals

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

0 голосов
/ 29 мая 2011

Вопрос субъективный и аргументативный ...

Это зависит от вашего шаблона использования. Если вы постоянно тянете отдельные узлы по идентификатору, храните каждый из них отдельно.

Кроме того, обратите внимание, что в любом случае сохранение списка не так уж и полезно, за исключением верхних 20. Если вы вставляете / обновляете / удаляете узел таким образом, что верхние 20 больше не действительны, вы может потребоваться сброс следующих 20 и т. д.

Наконец, имейте в виду, что это кеш. Если вы используете кеш, вы делаете основное утверждение, что нет ничего страшного, если выводимые данные немного устарели.

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