Вопрос по database – Портирование с SQLite на Redis

1

Я использовал SQLite для приложения, в котором я использовал для хранения 8-10 столбцов. Я использовал для получения данных на основе комбинации любого количества этих атрибутов. Теперь я хочу портировать на Redis. Поэтому я создавал тестовое приложение для него.

Но я не могу придумать, как спроектировать мою систему Redis таким образом, чтобы я мог получать данные на основе любого из этих атрибутов. У кого-нибудь из вас есть совет / опыт?

Ваш Ответ

1   ответ
5

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

Redis не включает в себя язык запросов (а скорее команды a la 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) (и их можно комбинировать с обычными наборами).

Этот метод обычно довольно быстрый, если значения достаточно дискриминантны. Обратите внимание, что вы не обладаете гибкостью СУБД (хотя нет регулярных выражений, нет поиска с префиксом, запросы по диапазонам - трудная задача, и т. Д ...)

Похожие вопросы