2016-04-29 6 views
1

У меня есть набор ключей, которые хранят json-подобные данные. В течение некоторого периода времени эти ключи часто обновляются моим приложением, но после этого они истекают и не будут (или очень редко будут) обновляться снова.
Однако на этих «ключах» на протяжении всей истории необходимо запускать агрегирующие запросы (например, SELECT SUM(value) FROM keys WHERE property1='...'), включая как истекшие, так и текущие ключи.Базовый эквивалент redis + rdbms

В настоящий момент я использую комбинацию redis + sqlite. Redis сохраняет текущий набор ключей в памяти. Затем задание scan s redis, экспортирует данные в sqlite.
Когда мне нужно запустить запрос агрегации, я сначала запускаю его на sqlite, а затем scan redis для дополнительных значений.

В то время как этот комбо, кажется, работает там некоторые раздражители:

  1. необходимости поддерживать две отдельные услуги. Если по какой-то причине redis перестает работать или работа терпит неудачу или таблица sqlite повреждена, я попадаю в неопределенное состояние.

  2. неоднородный api. Мне нужно разделить запрос по частям, один для sqlite, один для redis, запускать их отдельно, обрабатывать результаты отдельно и комбинировать их.

  3. Выполнение запросов от redis может занять много времени, поскольку для ключей нет указателей. Вызов keys блокирует сервер, вызывающий scan часто заканчивается слишком большим количеством итераций.

Есть ли одна база данных, которая бы соответствовала моим потребностям? Возможно, есть варианты конфигурации для redis?

ответ

1

Такие операции должны быть разработаны на прикладном уровне, выдающем команды Redis, а в некоторых случаях - с использованием сценариев Lua.

Если вы правильно моделируете свои данные в Redis, вы сможете получить данные, как вам нужно, чтобы работать с ним с выбранным вами языком прикладного уровня (JavaScript, C#, Java, Python, Ruby. ..).

Текущие запросы от redis могут занять много времени, потому что есть нет указателей для ключей. Клавиши вызова блокируют сервер, вызывающий сканирование часто заканчивается слишком большим количеством итераций.

Это совершенно неверное утверждение. Redis индекс сам. Собственно, это похоже на работу с индексами напрямую.

Для того, чтобы их классифицировать, вам необходимо использовать встроенные структуры данных, чтобы их можно было классифицировать, а затем получать подмножества ваших данных на основе критериев пользовательского уровня приложения.

Есть ли одна база данных, которая бы соответствовала моим потребностям?

Возможно, вам стоит взглянуть на Кассандру. Табличная база данных NoSQL, которая имеет агрегированные функции. Или Монго. Там много вариантов, но не из них победит Redis, который является самым быстрым на сегодняшний день (, когда прецедент хорошо подходит для Redis, конечно!).

+0

Не могли бы вы описать более подробно или дать ссылку на то, как «оптимально моделировать мои данные в Redis» и «использовать встроенные структуры данных для индексации ваших данных, чтобы их можно было классифицировать»? Я использую redis как хранилище ключей. Возможно, я ошибаюсь, и есть указатели на клавиши, но поиск по шаблону через 'keys xyz *' занимает около 2 секунд, в течение которых сервер блокируется. Если я использую 'scan 0 xyz *', для перебора всех ключей требуется около 50 секунд. – xaxa

+0

@xaxa Кажется, что вы игнорируете, что ключи Redis могут хранить наборы, списки, хэши ... Вы не ограничены строковыми строками. См. Например, этот вопрос и ответы, на которые я автоматически ответил на свой вопрос: http://stackoverflow.com/questions/19066462/something-like-a-tag-cache-and-querying-it-for-suggesting-them-using- redis –

+1

@xaxa Нет окончательного ответа на вопрос о том, как моделировать данные, но посмотрите на это: http://redis.io/topics/data-types-intro –