2013-07-02 2 views
2

Я использую redis много в последнее время и действительно люблю его. Я в основном знаком с настойчивостью (rdb и aof). У меня есть одна проблема. Я хотел бы иметь возможность выборочно «архивировать» некоторые мои данные на диск (или более дешевое хранилище), как только это уже не важно. Я действительно не хочу его удалять, потому что в какой-то момент это может оказаться ценным.архивирование некоторых данных redis на диск

Все мои ключи называются id_<id>_<someattribute>. Поэтому, когда я закончил с id 4, я хочу «архивировать» все ключи, которые соответствуют id_4_*. Я могу легко просмотреть их с помощью командной строки, но я ничего не могу с ними поделать. У меня довольно много данных (очень больших растровых изображений), связанных с этим набором данных, и, честно говоря, я не могу позволить себе пространство, как только идентификатор больше не является релевантным или важным.

Если бы это были mysql, у меня были бы разные таблицы, и я бы просто просто удалил его в .sql-файл, а затем отменил таблицу. Фактический .sql-файл мне не очень полезен, но я мог бы переименовать данные, если/когда мне это нужно. Или, может быть, у меня есть база данных mysql, и я хочу переместить одну таблицу в другую базу данных. Имеются ли перерасчеты для этих процессов? Есть ли способ сделать rdb или aof файл, который является подмножеством данных?

Любая помощь по этому вопросу будет оценена по достоинству! Благодаря!

+0

Это старый вопрос, чтобы добавить комментарий, но каково было ваше решение для выборочного архивирования ключей? Я собираюсь хранить данные аналитики с помощью растрового изображения, и я могу захотеть архивировать растровые ключи, содержащие статистику посетителей для старого/неактивного содержимого. –

+1

Я только что опубликовал то, что я сделал в качестве ответа ниже. Я надеюсь, что это помогает! – Landon

ответ

0

Несколько предложений для вас ...

Я хотел бы иметь возможность выборочно «архив» некоторые из моих данных на диск (или более дешевое хранение), как только это уже не важно. Я не действительно хочу удалить его, потому что он может быть ценным в какой-то момент.

Если такие данные ценны, используйте традиционную базу данных для хранения. Несмотря на то, что redis поддерживает привязку к диску и журналам AOF, вы должны рассматривать его как наиболее экономичное хранилище. Основным вариантом использования redis является сокращение латентности, а не сохранение ценных данных.

Так что, когда я закончу с идентификатором 4, я хочу в "архив" все все ключи, которые матч id_4_ *

Что представляет собой сделать? Вы должны задать себе этот вопрос; означает ли это, что через 1 день данные могут выпасть из redis? Если это так, просто используйте TTL и срок действия, чтобы redis удалял объект из памяти. Если вам это нужно снова, вернитесь в базу данных и верните объект обратно в redis. Этот первый клиент получит удар по удалению из db, но последующие запросы будут кэшироваться. Если сделано означает что-то, не связанное с определенной продолжительностью, тогда вам придется удалить элементы из redis вручную, чтобы сохранить пространство памяти.

Если бы это было MySQL, я бы мои различные таблицы и будет очень легко просто сбросить его в .sql файл, а затем удалить таблицу. Фактический файл .sql не подходит мне непосредственно, но я мог бы переименовать данные , если/когда мне это нужно.

Мы делаем то же самое в моей фирме. Важные данные импортируются в redis из rdbms, выполняемых как задание по требованию. Мы не отбрасываем таблицы, мы просто выборочно импортируем данные из базы данных в redis; ничего плохого в этом.

Можно ли каким-либо образом создать файл rdb или aof, являющийся подмножеством данных ?

Я не верю, что есть способ сделать выборочное архивирование; это либо все, либо нет.

ИМО, проводите больше времени, играя с redis. Я настоятельно рекомендую использовать готовые функции вместо того, чтобы изобретать и/или переделывать решения в соответствии с вашими потребностями.

Надежда, что помогает! ...

+0

Спасибо за ваши мысли. Но redis поддерживает более сложные структуры данных больше, чем простой ключ/значение, представленные как строки. У них есть хеши и растровые изображения. Я действительно не знаю, как легко сохранить растровое изображение в mysql. – Landon

+1

http://redis.io/commands/setbit Я использую эту команду для создания растровых изображений в redis – Landon

+0

Не знал об этом, спасибо. – raffian

1

Вместо того, чтобы извлечь данные из живого экземпляра Redis для архивирования цели, мое предложение было бы извлечь данные из файла дампа.

Запустите команду bgsave для создания дампа, а затем используйте инструменты redis-rdb для извлечения интересующих вас ключей. Вы можете легко получить результат в виде json-файла.

См https://github.com/sripathikrishnan/redis-rdb-tools

Вы можете сохранить данные в формате JSON в плоских файлах, или попытаться сохранить их в реляционную базу данных или хранилище документов, если вам нужно, чтобы быть проиндексированы для поиска цели.

2

@ Hoseong Hwang недавно спросил, что я сделал, поэтому я публикую то, что я закончил делать.

На самом деле все было довольно просто. Мне пригодился тот факт, что мое ключевое пространство сегментировано разными пользователями. Все мои ключи были из строя user_<USERID>_<OTHERVALUES>. Мои архивные потребности были на основе пользователей, некоторые данные пользователя больше не нуждались в том, чтобы их можно было сохранить в redis.

Итак, я запустил еще один экземпляр redis-server, на другом порту локально (6380?) Или на другой машине, это не имеет значения. Затем я написал короткий скрипт, который в основном называется KEYS user_<USERID>_* (я понимаю, что блокирующий характер KEYS, мое ключевое пространство настолько мало, что это неважно, вы можете использовать SCAN, если это проблема для вас.) Затем для каждого ключ, I MIGRATE D их к этому новому redis-server экземпляра. После того, как все было сделано. Я сделал SAVE, чтобы убедиться, что файл rdb для этого экземпляра обновлен. И теперь у меня есть тот rdb, который является только содержимым, которое я хотел архивировать. Затем я прекратил это временное redis-server и память была восстановлена.

Теперь сохраните этот файл rdb где-нибудь для дешевого, безопасного хранения. И если вам когда-нибудь понадобится это снова, сделав обратное моему процессу выше, чтобы вернуть эти ключи в ваш основной redis-server, было бы довольно просто.

+0

Благодарим за быстрый ответ! Это похоже на умный способ сделать это. В моем случае мне нужно восстановить архивные ключи в реальном времени - возможно, в реляционные базы данных или внешнюю память, такую ​​как S3. –

Смежные вопросы