2012-02-21 1 views
2

У меня есть около 50 000 объектов json, которые я храню в Redis. Это хорошо работает для основного случая поиска объекта по его уникальному ключу.Хранение данных в Redis и/или реляционной базе данных

Теперь я должен добавить функцию для поиска объектов на основе сложных запросов на основе данных объектов. Например, все предметы с авторами типа «lex», опубликованные между 2011-03-01 и 2012-01-12, содержат более 5 предметов на складе.

С SQL это просто. Я не очень хорошо знаю Редис, но не видел ничего подобного.

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

Данные у меня редко происходят, и я буду знать, когда и что изменилось. Поэтому я могу импортировать данные в rmdb и Redis при их обновлении.

Этот подход является хорошей идеей?

+0

Почему бы не полностью переключиться на реляционную БД? Объекты 50k - ничто, любая БД будет обрабатывать это. –

+2

И если вы все еще хотите хранить JSON, я рекомендую [MongoDB] (http://mongodb.org). –

+0

У меня есть данные в формате json, я загружаю его другим программам, которые хотят его в формате json. Кажется странным иметь db, сопоставляя его с таблицами, а затем перестраивать его обратно в json, когда это было просто ключевым поиском значения в то время. – Cogslave

ответ

3

Что вам нужно - это база данных документов (одна из сторон NoSQL).

Как @Sergio предложил, MongoDB является одним из них. Есть и другие (CouchDB, RavenDB и более), и вы должны проверить, что лучше всего подходит для вас. Они различаются по производительности, способности репликации, стабильность, зрелость, поддержка и т.д.

+0

У меня теперь был шанс прототипировать MongoDB, поскольку этот конкретный прецедент выглядит намного лучше, чем моя идея. – Cogslave

5

ли запросы динамически? Поскольку вы можете создавать структуры в Redis, делайте такие запросы, как то, что вы описываете. Например, используйте упорядоченные наборы для времени, имеют другой упорядоченный набор для номеров инвентаря, запрашивают и пересекают их. Если вы знаете, какие поиски вы хотите запустить, вы можете сделать Redis очень быстро для вас. Если запросы все время меняются (разыгрывать данные, анализируя их и т. Д.), То это не очень хорошее решение.

Так что для хранения что-то

set key object1 

zadd time_set object1.time object1 
zadd inventory_set object1.inventory object1 

для запроса времени и инвентаризации

zrangebyscore time_set min_time max_time 
zrangebyscore inventory_set min_inventory max_inventory 

Then you intersect them yourself, since results are just ids this is really fast. Once you intersected them just do an 

mget item1, item 2... 

В общем Redis работает очень хорошо, когда вы точно знаете, какие запросы вы будете работать на нем.