Скопируйте все ключи с одного db на другой в redis

Instade of move Я хочу скопировать все мои ключи из определенного db в другой. Возможно ли в redis, если да, то как?

Ответ 1

Если вы не можете использовать MIGRATE COPY из-за своей версии redis, вы можете скопировать каждый ключ отдельно, что занимает больше времени, но не требует входа в систему на самих машинах и позволяет перемещать данные из одной базы данных. другому. Вот как я копирую все ключи из одной базы данных в другую (но без сохранения ttls)

#set connection data accordingly
source_host=localhost
source_port=6379
source_db=0
target_host=localhost
target_port=6379
target_db=1

#copy all keys without preserving ttl!
redis-cli -h $source_host -p $source_port -n $source_db keys \* | while read key; do echo "Copying $key"; redis-cli --raw -h $source_host -p $source_port -n $source_db DUMP "$key" | head -c -1|redis-cli -x -h $target_host -p $target_port -n $target_db RESTORE "$key" 0; done

Ключи не будут перезаписаны, для этого удалите ключ перед копированием или очистите всю базу данных перед запуском.

Ответ 2

Не напрямую. Я бы предложил использовать всегда удобный пакет redis-rdb-tools (от Sripathi Krishnan) для извлечения данных из нормального дампа rdb и повторного его добавления в другой экземпляр.

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

Ответ 3

Я знаю, что это устарело, но для тех, кто приехал сюда, Google:

Я только что опубликовал утилиту интерфейса командной строки для npm и github, которая позволяет копировать ключи, соответствующие данному шаблону (даже *) из одной базы данных Redis в другую.

Вы можете найти утилиту здесь:

https://www.npmjs.com/package/redis-utils-cli

Ответ 4

redis-cli -a $source_password -p $source_port -h $source_ip keys /*| while read key; 
do echo "Copying $key"; 
redis-cli --raw -a $source_password -h $source_ip -p $source_port -n $dbname DUMP "$key"| head -c -1| redis-cli -x -a $destination_password -h $destination_IP -p $destination_port RESTORE "$key" 0;

Ответ 5

Копирует все ключи из номера базы данных 0 в номер базы данных 1 на локальном хосте.

redis-cli --scan | xargs redis-cli migrate localhost 6379 '' 1 0 copy keys

Если вы используете один и тот же сервер/порт, вы получите ошибку тайм-аута, но ключи, похоже, все равно будут копироваться. Ошибка GitHub Redis # 1903

Ответ 6

Если вы переносите ключи внутри одного и того же модуля redis, вы можете использовать для этого внутреннюю команду MOVE (конвейеризация для большей скорости):

#!/bin/bash

#set connection data accordingly
source_host=localhost
source_port=6379
source_db=4
target_db=0

total=$(redis-cli -n 4 keys \* | sed 's/^/MOVE /g' | sed 's/$/ '$target_db'/g' | wc -c)
#copy all keys without preserving ttl!
time redis-cli -h $source_host -p $source_port -n $source_db keys \* | \
  sed 's/^/MOVE /g' | sed 's/$/ 0/g' | \
  pv -s $total | \
  redis-cli -h $source_host -p $source_port -n $source_db >/dev/null

Ответ 7

Вы можете просто сделать это, он переместит все ключи с db 1 на db 3
redis-cli -n 1 keys '*' | xargs -I % redis-cli move % 3 > /dev/null

Ответ 8

Попробуйте использовать дамп, чтобы сначала сбросить все ключи, а затем восстановить тот же

Ответ 9

Насколько я понимаю, вам нужно скопировать ключи из определенного БД (например, 5) в конкретный БД, скажем 10. Если это так, вы можете использовать redis database dumper (https://github.com/r043v/rdd). Хотя в соответствии с документацией у него есть переключатель (-d), чтобы выбрать базу данных для работы, но не работал у меня, так что я сделал

1.) Отредактируйте файл rdd.c и найдите функцию int main (int argc, char argv)
2.) Измените БД в соответствии с вашим требованием
3.) скомпилируйте src ** make

4.) Сбросьте все ключи, используя ./rdd -o "save.rdd"
5.) Еще раз отредактируйте файл rdd.c и измените DB
6.) Сделайте еще раз
7.) Импорт с помощью ./rdd "save.rdd" -o insert -s "IP" -p "Порт"