@man_without_face
студент

Как правильно кэшировать редко изменяемые данные?

Когда пользователь заходит в профиль, у него справа есть панели транзакций и событий. Формируются они не простым путём, т.е. парсятся некоторые данные, потом формируются и всё такое. Так вот эта панель на всё проекте всегда видна пользователю. Куда бы ни пошёл - везде она будет. Но получается, что каждый переход по страницам - отбирает по 1.5 секунды на загрузку из-за этого блока. Транзакции, как и события - могут меняться с неопределённой периодичностью. Т.е. например сегодня могут добавиться транзакции, а завтра нет, а после завтра они могут появляться каждые полчаса.

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

Или я ошибаюсь? Поясните пожалуйста, как быть в подобной ситуации. Учитывая то, что на загрузку какого-то там блока тратится 1.5 секунды - это прям растрата "бюджета". :)

P.S. Ах да, забыл добавить. Транзакции и события зависят от идентификатора пользователя. Возможно это важно.
  • Вопрос задан
  • 2647 просмотров
Решения вопроса 1
Tark
@Tark
Pyramid'альный мир
Кешировать стоит как раз те данные, которые постоянно нужны.

Постойте, у вас пользователь ждёт полторы секунды на загрузку каждой страницы - и не за счёт огромного количества данных, а потому, что эти данные заново собираются? Но это же RoR-приложение, самописное, я правильно понимаю? То есть у вас есть доступ к коду, который всё это показывает и к коду, который вызывается, когда транзакции добавляются? Тогда при обновлении транзакций делайте кеш для этого пользователя "протухшим", а в коде, который всё это хозяйство формирует, заново добавляйте кешированный результат в memcached и показывайте его. Тогда в следующий раз актуальный кеш будет выбран из системы кеширования, но на это потребуется в полторы тысячи раз меньше времени, а данные будут всё время актуальными.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Prognosticator
@Prognosticator
TODO: Здесь будут ворованные умные мысли, типа мои
У вас ответ в вопросе )
Я не очень знаком с кэшированием

Ознакомьтесь.
Храните данные панелей в Memcached. Показывайте "устаревшие" данные, если это не критично для приложения.
Либо подгружайте данные через ajax.
Ответ написан
@thepry
Ruby on rails, 1С разработчик
По моему нубскому мнению тут нужно понять какие данные можно использовать для того, чтобы понять появились новые транзакции, или нет. А потом их использовать - либо получать каждый раз данные, достаточные для этого вывода, либо где-то(напр. в таблице) хранить информацию о дате последней транзакции и, если она отличается от записанной в кэше, то обновлять.
Ответ написан
@vsuhachev
Вы неправы, кэширование прокатит. Но кэш нужно обновлять и это сильно зависит где и как хранятся ваши данные о транзакциях. В общем случае есть следующие варианты:

1) Сбрасывать кэш по истечении определенного интервала времени. Например каждый час.
2) Сбрасывать кэш по событию. Например функция по созданию транзакций сбрасывает кэш
3) Сбрасывать кэш по дате обновления кэшируемого объекта. Это когда хранятся время создания кэшированных данных и при обращении к кэшу сравнивается со временем модификации объекта, если оно позже то кэш обновляется.

Как уже вам посоветовали - ознакомьтесь с системой кэширования. В 4 рельсах она из коробки и достаточно продвинутая.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы