2012-07-01 7 views
5

Redis концептуально отличается от традиционных баз данных SQL, которые я использую, и я пытаюсь выяснить, подходит ли это для моего проекта ... Я искал вокруг, но не могу найти ответ на мой вопрос.Redis и Querying Values ​​

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

user:fef982dcfe1a7bcba4849b4c281bba95 
"username" "andrewm" "name" "Andrew" 

У меня также есть куча сообщений, которые я хочу, чтобы хранить, каждый из которых имеет несколько свойств, таких как отправитель и получатель:

message:1a7bcba4849b4c281bfef98a952dcfeb 
"sender" "fef982dcfe1a7bcba4849b4c281bba95" "recipient" "82dcfe1a7bcba4849b4c281bba95fef9" "message" "Hi!" 

Мой вопрос: как я могу получить все сообщения, отправленные конкретным пользователем (обозначенные их хэшем). Должен ли я использовать традиционную реляционную базу данных или даже базу данных NoSQL, такую ​​как MongoDB (которую я использовал раньше)? Если да, есть ли у кого-нибудь предложения для высокопроизводительных магазинов? Я не буду делать истинный поиск (т. Е. MySQL LIKE запросов) - просто поиск ключевых значений.

ответ

7

Это, конечно, можно смоделировать эти данные с помощью Redis, но вам нужно думать в терминах структур данных и путей доступа. С Redis пути доступа управляются неявно (например, с помощью индексов в RDBMS/MongoDB).

Для предоставленному Например, вы могли бы:

user:<user hash> -> hash of user properties 
user:<user hash:sent -> set of <msg hash> 
user:<user hash>:received -> set of <msg hash> 
message:<msg hash> -> hash of message properties 

Добавление/удаление сообщения будет означать сохранение *: посланный и *: получили комплекты, соответствующие отправителям и получателям, в верхней части добавления/удаления сам объект сообщения.

Получение отправленных или полученных сообщений для данного пользователя только команда SMEMBERS или СНП, если вы хотите получить также свойства сообщения одновременно:

# Get a list of message hash codes only in one roundtrip 
smembers user:<user hash>:received 

# Get a list of message contents in one roundtrip 
sort user:<user hash>:received by nosort get message:*->sender get message:*->message 

Для обоснования об использовании сортировать, см:

Примечание 1: с Redis лучше использовать целые числа в качестве ключей, а не UUID или хэш-коды (особенно в наборах), поскольку они хранятся более эффективным способом.

Примечание 2:, если вам нужно заказать эти сообщения, тогда вместо списков необходимо использовать списки. В результате можно удалить только самые старые сообщения, и эффективными могут быть добавлены только новостные сообщения. Вероятно, вы также должны добавить глобальный список для всех сообщений.

+0

Большое спасибо за это объяснение ... это было очень полезно. Я посмотрю на это дальше :) –

+0

Привет, спасибо, очень полезно. Если «Добавление/удаление сообщения будет означать поддержание *: отправленных и полученных:», потребуется ли больше места для хранения данных и, следовательно, занимает больше места в памяти? Может ли быть проблемой для производительности, если этот вид «мульти-магазина» выполняется часто? Спасибо за вашу помощь. – Loic

+0

Да, он представляет больше данных для хранения. Что касается производительности, вы должны использовать конвейерную обработку, чтобы амортизировать влияние выполнения нескольких команд для данной операции. См. Http://redis.io/topics/pipelining –