Существует SWAPDB
, который позволяет вам поменять их местами.
Нет встроенной поддержки слияния, поскольку могут быть конфликты. Если в обеих базах данных есть два ключа с одинаковым именем, его необходимо разрешить.
Команды MOVE
позволяют переместить ключ из текущей БД в БД назначения .
Вы можете использовать комбинацию SCAN и MOVE
, чтобы выполнить слияние. Я предлагаю SCAN
вместо KEYS
, потому что если вы делаете это в работе, вы не хотите блокировать сервер на длительные периоды времени.
Здесь скрипт Lua для этого:
local result = redis.call('SCAN', ARGV[1])
local conflict = {}
local moved = {}
for _,key in ipairs(result[2]) do
if redis.call('MOVE', key, ARGV[2]) == 0 then
table.insert(conflict, key)
else
table.insert(moved, key)
end
end
result[2] = conflict
result[3] = moved
return result
Вы вызываете это с параметрами:
- numkeys:
0
- ARGV [1]: курсор для
SCAN
, первоначально 0
. - ARGV [2]: база данных назначения. Например,
2
Сначала убедитесь, что SELECT
исходная база данных.
Вот пример первого запуска:
> EVAL "local result = redis.call('SCAN', ARGV[1]) \n local conflict = {} \n local moved = {} \n for _,key in ipairs(result[2]) do \n if redis.call('MOVE', key, ARGV[2]) == 0 then \n table.insert(conflict, key) \n else \n table.insert(moved, key) \n end \n end \n result[2] = conflict \n result[3] = moved \n return result" 0 0 2
1) "56"
2) 1) "key:6"
3) 1) "key:79"
2) "key:96"
3) "key:44"
4) "key:91"
5) "key:82"
6) "key:25"
7) "key:22"
8) "key:41"
9) "key:73"
Здесь SCAN
найдено 10 клавиш, возвращен следующий курсор 56
. key:6
был найден в пункте назначения, поэтому он не был перемещен. Третья запись - это список фактически перемещенных клавиш.
Как и в случае SCAN
, вам нужно вызывать несколько раз, пока курсор возврата не станет 0
. И помните, что добавленные ключи между SCAN
вызовами могут или не могут быть возвращены.
Вы можете изменить сценарий Lua на:
- Реализовать логику слияния c, например, удалить ключ в пункте назначения, а затем переместить, и все равно сообщать об удаленном ключе в пункте назначения отдельно.
- Измените
SCAN
, чтобы использовать большее значение COUNT
, если вы хотите, чтобы больше ключей охватывалось вызовом. - Замените
SCAN
на KEYS
, чтобы сделать это на одном go.