Кэширование для каждого пользователя


На моем веб-сайте пользователи будут перенаправлены на страницу "главная страница", где они смогут просматривать последние новости, свои специальные объявления, свои собственные материалы и т.д. Теперь я должен использовать базу данных для извлечения всей этой информации. Я также хочу использовать кэширование для этой цели, чтобы данные на их главной странице обновлялись каждые 3 часа, скажем, вместо каждого посещения.

Для достижения этой цели я использую следующую функцию:

function mymodule_cache($reset = FALSE) {
  static $my_data;
  global $user;
  if (!isset($my_data) || $reset) {
    if (!$reset && ($cache = cache_get('user_data:' . $user->uid)) && !empty($cache->data)) {
      $my_data = unserialize($cache->data);
    }
    else {
      $my_data = ... (This is where I do all the DB queries, etc.);
      cache_set('user_data:' . $user->uid, serialize($my_data), 'cache', time() + 10800); 
    }
  }
  return $my_data;

}

Теперь это отлично работает, но мой вопрос в том, как, если у меня будет множество пользователей, скажем, 10 000 пользователей, было бы эффективно по-прежнему использовать этот метод кэширования, поскольку мы заполняем строки таблицы данными?

Или, если нет, то какое лучшее решение?

Спасибо Лука

 2
Author: Luca, 2011-10-03

1 answers

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

  • Используйте пользовательскую ячейку кэша вместо общей таблицы кэша. Особенно важно, если вы не следуете второму пункту. Потому что ячейка кэша "кэш" обычно содержит информация, которая запрашивается практически по каждому запросу.

  • Используйте другой сервер кэша, например Memcache. Это позволяет избежать увеличения вашей базы данных из-за этих записей в кэше и ускоряет поиск в кэше. Видишь https://drupal.stackexchange.com/questions/12307/where-is-the-best-place-for-cache-bins-drupal-7

Две дополнительные подсказки:

  • Следите за количеством операций чтения/записи этого кэша, чтобы увидеть, действительно ли кэш помогает. Если, скажем, 50% записи кэша только записываются и никогда не читаются, возможно, вам стоит подумать о том, чтобы избежать кэширования этой информации.

  • Особенно при использовании серверной части кэша, такой как Memcache (которая имеет меньшие накладные расходы на вызовы кэша), может быть полезно разделить данные на несколько отдельных записей кэша. Для этого существует ряд преимуществ:

    1. Вы можете кэшировать определенную информацию дольше, чем другие (возможно, новое объявление появляется только каждые несколько дней, но несколько новых комментарии/сколько угодно в час
    2. Некоторые данные могут быть даже не специфичными для пользователя, а специфичными только для ролей, которые есть у пользователя, или даже глобальными. Так, например, все объявления могут быть прочитаны из одной записи кэша.
    3. Вы можете использовать cache_clear_all() для очистки определенных кэшей для определенных событий. Например, очистите все кэши новостей, если будет опубликована новая новость. Сделав это, все пользователи смогут сразу же увидеть новости. Если это работает хорошо, вы можете увеличить срок действия кэша время.
 1
Author: Berdir, 2017-04-13 12:47:02