Как лучше работать с пользовательскими лайками?

Сейчас работаю над проектом который предполагает высокую нагрузку.


На страницах сайта есть много элементов, которые можно «лайкать» и соответственно у каждого «лайка» есть индикатор – «лайкнул» пользователь запись или нет.


Сейчас при каждой загрузке страницы идет обращение к базе и тем самым мы рисуем индикаторы для пользователя (красное или серое сердечко).


При использовании кэширования эта актуальность индикаторов теряется. Возник вопрос, каким способом поддерживать эту актуальность, используя кэширование?


В голову приходят такие варианты:


1) Делать ajax запрос после загрузки страницы и расставлять лайки js-ом.

2) После логина пользователя, хранить все его лайки в куках и так же расставлять их потом js-ом (избавляемся от ajax запросов)


Спасибо за ответы!
  • Вопрос задан
  • 6892 просмотра
Пригласить эксперта
Ответы на вопрос 2
ur001
@ur001
Программист. Искатель. Сноб. Социальный ассоциатор
Если на каждый лайк делать по запросу, выйдет тяжело. Тяжелее чем то же самое сразу на сервере.
Мне не удалось придумать адекватную систему кеширования для подобных элементов. На Хабре и других высоконагруженных проектах делаются запросы типа

SELECT ... FROM votes WHERE user_id=<id> AND object_id IN(...)

Один запрос на все лайки одного типа. N запросов, если на странице N типов объектов.

Можно попробовать хранить (или дублировать) голоса в NoSQL, например в Redis с ключами типа «post_{post_id}_{user_id}» и вытаскивать их одним запросом mget… Но вы сначала запуститесь, и поймите что именно получение голосов у вас является узким местом, а потом городите такие штуки.
Ответ написан
все лайки текущей страницы можно вытянуть одним запросом.
SELECT ... FROM votes WHERE user_id=<id> AND uri IN(...)
где uri — универсальный идентификатор объекта. Например
фото 1 — photo://1
юзер 1 — user://1
и т.д.

В итоге не нужно разбиение на типы. Кроме того uri-подход во многих местах оказывается удобным. Например можно вести статистику вне зависимости от типа объекта.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы