Redis на основе курсора нумерации страниц на основе MongoDb ObjectId - PullRequest
0 голосов
/ 12 ноября 2018

У меня пока нет опыта работы с Redis, но я изучаю возможности использования MongoDB в качестве базы данных и Redis в качестве кеша.

Вопрос, с которым я имею дело, заключается в том, способен ли Redis обрабатывать идентификаторы MongoDb ObjectId в области пагинации на основе курсора, как описано, например, здесь: https://developer.twitter.com/en/docs/tweets/timelines/guides/working-with-timelines.html.
В этом примере у нас есть maxId, который служит максимальным идентификатором, который был выбран из предыдущего запроса, и будет использоваться в качестве нижней границы для выборки следующей страницы.

В MongoDb я исследовал, что это не проблема для пользователя больше / меньше, чем операторы в ObjectId, но я не знаю, смогу ли я справиться с этим в Redis, так как ObjectId, скорее всего, будет храниться как строковое значение.

Этот вопрос важен для меня, так как он поможет мне решить, использовать ли MongoDb ObjectId или использовать автоинкремент в качестве идентификатора PK. Я предпочел бы использовать ObjectId, хотя.

Примечание: я пишу свой бэкэнд с Java, поэтому модные модули npm - это не то, что мне нужно.

1 Ответ

0 голосов
/ 18 ноября 2018

Решение, которое я придумал:

  • Использовать метку времени в качестве курсора
  • Сохранить временную метку как счет в Redis. Даже когда в этом случае теоретически возможны повторяющиеся оценки, вероятность того, что это вызовет конфликт с точки зрения нумерации страниц, для моего приложения незначительна.
    Например: у меня есть дубликат на 10-м результате. Следующий запрос будет включать текущую временную метку в свой результат, что означает, что 10-й и 11-й результаты будут возвращены при следующем запросе.
  • Если Redis вернет результаты, хорошо
  • В случае, если Redis не возвращает результаты, курсор метки времени также может использоваться для запроса ObjectId в MongoDb. Хотя ObjectId не поддерживает миллисекунды, это не является реальной проблемой. Найти все objectId <= курсор времени с лимитом / смещением должно работать нормально. Временная метка курсора в поиске необходима, поэтому изменения в миллисекундах не вызовут проблем. </li>
  • В случае, если Redis возвращает только частичный результат, MongoDb может быть запрошен на основе ObjectId последнего доступного поста, который был найден в Redis.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...