Skip to content

Moving data from Redis: ruvio-ctl import

ruvio-ctl import --from redis://[user:password@]host:6379[/db] --to ruvio://host:6379[/db] \
[--match 'user:*'] [--batch 500] [--replace] [--dry-run] [--verify]

The tool scans the source with SCAN, reads each key by type (GET, LRANGE, SSCAN, HSCAN, ZSCAN, XRANGE), writes it to the target with ordinary commands and keeps the remaining TTL (PTTL then PEXPIRE). It needs no RDB file and works with any source version that speaks RESP2 (streams need Redis 6.2+ for the paging syntax).

  • Keys that already exist in the target are skipped and counted, so a second run is safe. --replace deletes and rewrites them.
  • --dry-run scans and counts; the target is not written.
  • --verify reads every copied key back from the target and compares it with what was read from the source (sets, hashes and sorted sets compare without order). The exit code is 1 when any key differs.
  • --match limits the keys; --db is part of the URL (redis://host/3).

What is not moved: stream consumer groups and pending entries, Lua scripts and functions, ACL users, module types, access statistics (idle time, frequency). Hashes with field TTLs lose the field deadlines (the source is read with HSCAN).

Consistency: SCAN is not a snapshot. A key that changes while the scan runs arrives with the old or the new value, and a key created after the scan passed its slot is missed. Stop writes to the source for a clean copy, or run the tool a second time with --replace.

Memory: one key is held in memory at a time, so a single multi-gigabyte collection needs that much RAM in the tool. Throughput on millions of keys and the SCAN load on the source were not measured.

DUMP and RESTORE in Ruvio use Ruvio’s own payload and cannot read Redis’s DUMP output.