Создание структуры кэширования для списка идентификаторов и объектов Json - PullRequest
0 голосов
/ 08 января 2019

Я стремлюсь создать более эффективную структуру кэширования для фида изображений пользователя на веб-сайте. Этот канал разбит на страницы. Поэтому мои выборки как в базе данных, так и в кэше будут использовать смещение / номер страницы.

Мой код написан на Python, а моя система кэширования - на Redis. Я использую пагинацию для получения смещения идентификаторов, кеширую их, а затем использую эти идентификаторы для извлечения объектов BLOB-объектов JSON из базы данных.

Существует два типа таблиц, которые связаны с созданием потока изображений. Существуют таблицы «Объект», которые содержат идентификатор, BLOB-объект json и отметку времени, а затем есть таблицы «Сопоставление», которые содержат сопоставление идентификаторов из одной таблицы объектов в другую таблицу объектов. Например:

пользователей (таблица объектов)

  • ID
  • имя пользователя
  • данные (JSON)
  • дата (отметка времени)

изображения (таблица объектов)

  • ID
  • данные (JSON)
  • дата (отметка времени)

user_has_images (таблица сопоставления)

  • user_id
  • image_id
  • дата (отметка времени)

Чтобы создать фид, мы сделаем следующее:

  1. Получить user_id из таблицы Users (на основе имени пользователя из URL).
  2. Используйте user_id для получения идентификаторов изображений из user_has_images.
  3. Используйте идентификаторы Image для получения объектов Image json из images

Каждая часть этого процесса кэшируется. Эта структура кэширования в настоящее время выглядит следующим образом: 1. Пользовательский объект кэшируется как один объект. 2. Страница 1 просматривается, User_has_images отображение кэшируется как user_profile_ids:{user_id}:{page_number} 3. Объекты изображений кэшируются в виде списка как один объект json с ключом user_profile_images:{page_number}

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

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

Вот два моих возможных решения этой проблемы:

  1. Срок действия нескольких кешей истекает. Каждый раз, когда пользователь выполняет редактирование своего объекта Image, мы пытаемся найти кеш, в котором может существовать изображение, и либо истечь, либо обновить его. Недостатком этого является то, что на сайте МНОГО различных каналов, и в любой момент времени мы не знаем, в каком изображении находится изображение, потому что нет ссылки на фактический идентификатор изображения.
  2. Кэширование объектов изображения по отдельности. Мы будем хранить каждый объект изображения по отдельности в кэше, чтобы их можно было найти на image_id. После того, как мы получили пару user_id => image_id, мы будем искать в кэше каждый объект изображения, используя image_id. Когда пользователь выполняет редактирование объекта изображения, мы должны обновлять его только в одном месте кэша, если он все еще был в кэше. Потенциальным недостатком здесь является то, что если запрашивается лента изображений, а фактический = Image объект не находится в кэше, нам нужно будет найти это изображение в базе данных (не уверен, что это будет происходить часто). Вторым потенциальным недостатком будет время истечения срока действия отдельного объекта изображения, если это произошло в нескольких каналах (возможно, это не будет проблемой?).

Есть мысли или предложения?

...