У меня есть набор ключей, которые хранят json-подобные данные. В течение некоторого периода времени эти ключи часто обновляются моим приложением, но после этого они истекают и не будут (или очень редко будут) обновляться снова.
Однако на этих «ключах» на протяжении всей истории необходимо запускать агрегирующие запросы (например, SELECT SUM(value) FROM keys WHERE property1='...'
), включая как истекшие, так и текущие ключи.Базовый эквивалент redis + rdbms
В настоящий момент я использую комбинацию redis + sqlite. Redis сохраняет текущий набор ключей в памяти. Затем задание scan
s redis, экспортирует данные в sqlite.
Когда мне нужно запустить запрос агрегации, я сначала запускаю его на sqlite, а затем scan
redis для дополнительных значений.
В то время как этот комбо, кажется, работает там некоторые раздражители:
необходимости поддерживать две отдельные услуги. Если по какой-то причине redis перестает работать или работа терпит неудачу или таблица sqlite повреждена, я попадаю в неопределенное состояние.
неоднородный api. Мне нужно разделить запрос по частям, один для sqlite, один для redis, запускать их отдельно, обрабатывать результаты отдельно и комбинировать их.
Выполнение запросов от redis может занять много времени, поскольку для ключей нет указателей. Вызов
keys
блокирует сервер, вызывающийscan
часто заканчивается слишком большим количеством итераций.
Есть ли одна база данных, которая бы соответствовала моим потребностям? Возможно, есть варианты конфигурации для redis?
Не могли бы вы описать более подробно или дать ссылку на то, как «оптимально моделировать мои данные в Redis» и «использовать встроенные структуры данных для индексации ваших данных, чтобы их можно было классифицировать»? Я использую redis как хранилище ключей. Возможно, я ошибаюсь, и есть указатели на клавиши, но поиск по шаблону через 'keys xyz *' занимает около 2 секунд, в течение которых сервер блокируется. Если я использую 'scan 0 xyz *', для перебора всех ключей требуется около 50 секунд. – xaxa
@xaxa Кажется, что вы игнорируете, что ключи Redis могут хранить наборы, списки, хэши ... Вы не ограничены строковыми строками. См. Например, этот вопрос и ответы, на которые я автоматически ответил на свой вопрос: http://stackoverflow.com/questions/19066462/something-like-a-tag-cache-and-querying-it-for-suggesting-them-using- redis –
@xaxa Нет окончательного ответа на вопрос о том, как моделировать данные, но посмотрите на это: http://redis.io/topics/data-types-intro –