Если данные постоянно меняются, что вы кешируете? (на примере Твиттера)

Я потратил некоторое время на изучение кэширования с помощью (redis и memcached в основном ), и мне трудно понять, где именно использовать кэширование, когда ваши данные постоянно меняются.

Возьмем, к примеру, Twitter (только что прочитал Делаем Twitter на 10000% быстрее). Как вы (или они )кэшируют свои данные, когда большой процент записей в их базе данных постоянно меняется?

Скажите, что в Твиттере есть эти модели:User, Tweet, Follow, Favorite.

Кто-то может опубликовать твит, который ретвитят один раз в день, а другой — тысячу ретвитов в день. Для этого 1000-кратного ретвита, поскольку в день около 24 * 60 == 1440минут, это означает, что твит обновляется почти каждую минуту (, скажем, он также получил 440 избранных ). То же самое с подпиской на кого-то, Чарли Шин даже привлек 1 миллион подписчиков в Твиттере за 1 день . Кажется, в этих случаях не стоит кэшировать, но, может быть, просто потому, что я еще не достиг этого уровня.

Скажем также, что среднестатистический подписчик в Твиттере либо пишет твиты, либо подписывается на них, либо добавляет в избранное по крайней мере один раз в день. Это означает, что в наивном интро -в случае схемы rails таблица пользователей обновляется не реже одного раза в день (tweet_count. и т. д. ). Этот случай имеет смысл для кэширования профиля пользователя.

Но что рекомендуется для приведенных выше примеров с 1000 твитов и 1 млн подписчиков, когда речь идет о кэшировании данных?

В частности, (предполагается использование memcached или redis и использование только JSON API (без кэширования страниц/фрагментов)):

  • Кэшируете ли вы отдельные твиты/записи?
  • Или вы кэшируете фрагменты записей с помощью разбивки на страницы (, например.redis списки из 20каждый )?
  • Или вы кэшируете как записи по отдельности, так и на страницах (, просматривая один твит, а не ленту JSON )?
  • Или вы кэшируете списки твитов для каждого отдельного сценария :твиты домашней временной шкалы, твиты пользователей, избранные твиты пользователей и т. д.? Или все, что выше?
  • Или вы разбиваете данные на «самые изменчивые (новейшие )» на «последние несколько дней» на «старые» фрагменты, где «старые» данные кэшируются с более длительным сроком действия или в дискретные списки с разбивкой на страницы или что-то в этом роде? А самые новые записи просто вообще не кешируются. (т. е. если данные зависят от времени, как твиты, вы относитесь к ним по-другому, если ваши старые записи знают, что они не сильно изменятся?)

Чего я не понимаю, так это соотношения того, насколько данные изменяются, и того, следует ли их кэшировать (и иметь дело со сложностями, связанными с истечением срока действия кэша ). Похоже, что Твиттер может кэшировать различные пользовательские твиты и домашние твиты для каждого пользователя , но тогда аннулирование кеша каждый раз, когда кто-то добавляет в избранное/твитит/ретвитит, будет означать обновление всех этих элементов кеша (. и, возможно, кешированные списки записей ), что в какой-то момент кажется означающим, что аннулирование кеша контрпродуктивно.

Каковы рекомендуемые стратегии кэширования данных, которые сильно меняются?

18
задан Lance Pollard 24 July 2012 в 07:10
поделиться