Геопространственное индексирование с помощью Redis & Sinatra для приложения Facebook - PullRequest
3 голосов
/ 09 января 2011

Я перестраиваю Любовников на Facebook с помощью Sinatra & Redis, и я хочу:

  • Операции с сетами для управления запросами и отношениями между пользователями
  • Геопространственная индексация для отображения ближайших пользователей приложения

Текущая реализация Redis

У каждого пользователя есть два упорядоченных набора Redis (reqSent & reqRecv) которые хранят идентификаторыSCORE, по которому мы упорядочиваем запросы, - это time (отметка времени UNIX), по которому был выполнен запрос.Я использую упорядоченные наборы вместо списков, потому что пользователь может только сделать Тип запроса (рид) кодируется как число и добавляется перед идентификатором пользователя.(rid | uid) Например, для пользователя с uid = 100 у нас может быть:

100:reqSent => ["1|123", "2|123", "2|134"]  # format: ["rid|tid"]
100:reqRecv => ["3|343", "5|142", "4|2224"] # format: ["rid|uid"]

MongoDB изначально поддерживает геопространственную индексацию , поэтому я подумываю перейти к этому.

В противном случае, как мне реализовать геопространственную индексацию с Redis?Должен ли я сделать это с Sunspot (localsolr)?Видимо, вы можете использовать Sunspot с Redis .

Ответы [ 2 ]

6 голосов
/ 10 января 2011

Мне нравится избегать нескольких платформ и реализовал нечто подобное, используя redis. Геопространственная индексация не сильно отличается от индексации чего-либо еще в Redis. Вам просто нужна функция, чтобы преобразовать широту / долготу в одно число, охватывающее соответствующую область, а затем использовать число в качестве ключа для набора, содержащего всех пользователей в этой области. Если вы выбрали правильную область, получение этого набора и, возможно, некоторых из его соседей должно дать вам соответствующее количество пользователей для выполнения расчетов фактического расстояния для окончательной фильтрации / сортировки.

Общий случай геопространственных запросов будет довольно сложно реализовать, но он вам не нужен, и Redis в любом случае является неподходящей платформой для специальных запросов.

4 голосов
/ 09 января 2011

Реализация геопространственной индексации в Redis кажется чрезмерно трудоемкой, если вы считаете, что MongoDB является допустимой опцией.Монго быстр и с ним приятно работать.Если большинство запросов будет соответствовать геопространственному индексу, то, по моему мнению, нет причин не использовать Mongo.

Я часто использую Mongo и Redis в одном проекте.Они оба имеют очень полезные свойства, и некоторые варианты использования действительно хорошо работают в Mongo, а некоторые в Redis.Тем не менее, обратное утверждение также верно: некоторые вещи действительно, очень трудно понять правильно в Redis, а другие вещи практически не возможны в Mongo.Геопространственные индексы являются примером первых, а операции множеств - примером последних.

Кроме того, не очень ли много известно о Sunspot, будет ли он на самом деле использовать Redis?Разве это не использует Solr, который использует файловую систему для хранения?Мне не кажется, что вы могли бы получить Redis там, и если я не совсем ошибаюсь, я бы сказал, что вы обязательно должны пойти с MongoDB.

...