Вопрос, связанный со случаем использования базы данных Redis / NoSQL - PullRequest
0 голосов
/ 15 августа 2011

Я создаю веб-сайт, на котором у меня будет два типа пользователей - X и Y. X будет немного (сотни), а Y будет много (миллионы). В основном для каждого X будет некоторый набор Ys. Y добавит друзей в свою сеть. X опубликует сообщение, которое можно увидеть для определенного набора Y, и эти люди могут переслать это сообщение своим друзьям. Друзья могут видеть это сообщение и могут либо переслать его друзьям, либо ответить отправителю.

Так что это мой вариант использования, и я изучал различные типы баз данных, в первую очередь базы данных NoSQL, потому что я считаю масштабируемость и производительность системы основными проблемами на моем веб-сайте. Я начал использовать API-интерфейсы Spring Data Redis и нашел его весьма полезным для моего случая использования. Мой вопрос здесь заключается в том, как мы выполняем операцию обновления в базах данных NoSQL, особенно в Redis. Допустим, я хочу обновить информацию пользователя, хранящуюся в Redis. Другой вопрос, как мне выполнить такие операции, как получить всех пользователей моложе 30 лет, если мы сохранили информацию о пользователях в Redis, в котором есть поле 'age'.

Я новичок в мире NoSQL и у меня очень мало опыта с этим. Я также хотел бы услышать от опытных людей о правильной базе данных для моего варианта использования. Ранее я использовал Spring, Hibernate в комбинации с MySQL в качестве базы данных и не был удовлетворен производительностью системы при большой нагрузке на систему.

Спасибо, Сачин

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

Лучший способ проверить, может ли Redis делать то, что вы хотите, - это установить его на компьютер разработчика и попробовать redis-cli. У этого встроенного клиента есть команда завершения и доступна справка (просто нажмите help <TAB>, чтобы увидеть категории), а также хорошая документация доступна на http://redis.io/commands.

Что касается вашего запроса, вы должны изучить структуру данных sorted set, чтобы сохранить информацию о пользователе. Это лучше, чем sets в одиночку, поскольку * допускает базовую форму запросов, как вы увидите:

Предположим, вы хотите иметь возможность опрашивать всех пользователей в возрасте от 18 до 30 лет в вашей базе данных, которая содержит (в качестве примера) 3 пользователя: Джо, 28 лет; Боб, 17 лет; и Адам, 50 лет.

Вы бы заполнили Redis как:

ZADD age 28 Joe
ZADD age 17 Bob
ZADD age 50 Adam

Синтаксис ZADD [key] [score] [member]. Набор находится в [key], и в отсортированных наборах каждый [member] имеет [score], который ДОЛЖЕН БЫТЬ ДВОЙНЫМ . Это означает, что вы не можете запрашивать оценки, используя строковые шаблоны или даже строковые значения (в этом случае Mongo должен быть лучше).

Итак, время для запроса. Я буду вставлять redis-cli запросов сейчас:


Чтобы просмотреть список всех пользователей в возрасте от 18 до 30 лет, вы должны сделать:

redis> ZRANGEBYSCORE age 18 30
1) "Joe"
redis> ZRANGEBYSCORE age 18 30 WITHSCORES
1) "Joe"
2) "28"

Опция WITHSCORES показывает результат каждого участника в результате.


Чтобы отобразить всех пользователей в возрасте до 18 лет:

redis> ZRANGEBYSCORE age 0 (18
1) "Bob"
redis> ZRANGEBYSCORE age 0 (18 WITHSCORES
1) "Bob"
2) "17"

Модификатор ( позволяет открывать начальный или конечный интервал. Это было бы похоже на where age >=0 and age < 18.


Для просмотра списка всех пользователей старше 30 лет:

redis> ZRANGEBYSCORE age 30 +inf
1) "Adam"
redis> ZRANGEBYSCORE age 30 +inf WITHSCORES
1) "Adam"
2) "50"

+inf - это бесконечность, поэтому нет верхнего предела для результата, как where age >= 30.

и т. Д.


Это действительно только начало. Вы можете выполнять пересечения, объединения и select count(*) операции в отсортированных наборах, все очень быстро, особенно если вы используете оптимизированную библиотеку (например, phpredis ). Надеюсь, у вас сложилось хорошее впечатление.

2 голосов
/ 15 августа 2011

Мой вопрос здесь заключается в том, как мы выполняем операцию обновления в NoSQL. базы данных конкретно в Redis. Допустим, я хочу обновить пользователя информация хранится в Redis.

Это зависит от структуры, в которой вы храните своих пользователей. Пятнадцатиминутное введение в типы данных Redis Учебное пособие поможет вам получить более полное представление об этих структурах данных. Обычно обновления выполняются с помощью операций SET, поэтому, если я сохранил информацию пользователя в структуре hash и хочу обновить определенное поле, я бы использовал команду HSET .

Другой вопрос, как мне выполнять такие операции, как получить мне все пользователи моложе 30 лет, если мы сохранили пользователя информация в Redis, у которой есть поле 'age'.

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

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