Я думаю, что лучший совет — не придерживаться реляционной модели при переносе чего-либо из СУБД в Redis. Помимо модели, важным отличием является то, что основное внимание уделяется путям доступа к данным, а также структурам данных.
Redis не включает язык запросов (а скорее команды в стиле memcached) и поэтому не может отвечать на произвольные запросы. Если путь доступа к данным не является частью структуры данных, то данные не могут быть эффективно извлечены.
Redis — не лучшее хранилище NoSQL, когда речь идет о поддержке произвольных запросов. Например, вам лучше подойдет что-то вроде MongoDB.
Теперь, если вы действительно хотите реализовать свои вещи с помощью Redis, вы можете попробовать использовать стратегию, аналогичную механизмам тегирования. Ваши записи могут храниться в хеш-объектах. Для каждой части столбца произвольных запросов, которые вам нужно поддерживать, вы создаете обратные индексы, используя наборы.
Например:
# Set up the records: one hash object per record
hmset user:1 name Bilbo type Hobbit job None
hmset user:2 name Frodo type Hobbit job None
hmset user:3 name Gandalf type Maiar job Wizard
hmset user:4 name Aragorn type Human job King
hmset user:5 name Boromir type Human job Warrior
# Set up the indexes: one set per value per field
sadd name:Bilbo 1
sadd name:Frodo 2
sadd name:Gandalf 3
sadd name:Aragorn 4
sadd name:Boromir 5
sadd type:Hobbit 1 2
sadd type:Maiar 3
sadd type:Human 4 5
sadd job:None 1 2
sadd job:Wizard 3
sadd job:King 4
sadd job:Warrior 5
# Perform a query: we want the humans who happen to be a king
# We just have to calculate the intersection of the corresponding sets
sinterstore tmp type:Human job:King
sort tmp by nosort get user:*->name get user:*->job get user:*->type
1) "Aragorn"
2) "King"
3) "Human"
Комбинируя объединение, пересечение, разность, можно реализовать более сложные запросы. Для недискретных значений или для запросов на основе диапазона необходимо использовать упорядоченные наборы (zset) (и их можно комбинировать с обычными наборами).
Этот метод обычно довольно быстр, если значения достаточно дискриминантны. Обратите внимание, что у вас нет гибкости РСУБД (нет регулярных выражений, нет поиска с префиксом, запросы диапазона - это боль, с которой нужно иметь дело, и т.д...)
person
Didier Spezia
schedule
29.05.2012