Можно ли объединить две отдельные БД (например, db0, db1), работающие в одном экземпляре Redis (6379), в одну отдельную БД (db0)? - PullRequest
1 голос
/ 27 января 2020

Не удается найти простое решение. Команда Migrate, похоже, не является решением. Сохранить, удалить их, создать одну единственную базу данных и загрузить резервную копию, может быть?

1 Ответ

2 голосов
/ 27 января 2020

Существует 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...