# redis-shake [![CI](https://github.com/alibaba/RedisShake/actions/workflows/ci.yml/badge.svg?branch=v3)](https://github.com/alibaba/RedisShake/actions/workflows/ci.yml) - [中文文档](./README_zh.md) redis-shake is a tool for Redis data migration and provides a certain degree of data cleaning capabilities. ## Feature * ⚡ high efficiency * 🌲 Native Redis data structure support * 🌐 Support single instance and cluster * ✅ Tested on Redis 5.0, Redis 6.0 and Redis 7.0 * 🤗 Supports custom filtering rules using lua * 💪 Support large instance migration ![image.png](https://s2.loli.net/2022/06/30/vU346lVBrNofKzu.png) # Document ## Install ### Binary package Release: [https://github.com/alibaba/RedisShake/releases](https://github.com/alibaba/RedisShake/releases) ### Compile from source After downloading the source code, run the `sh build.sh` command to compile. ```shell sh build.sh ``` ## Usage 1. Edit redis-shake.toml and modify the source and target configuration items in it. 2. Start redis-shake. ```shell ./bin/redis-shake redis-shake.toml ``` 3. Check data synchronization status. ## Configure The redis-shake configuration file refers to `redis-shake.toml`. In order to avoid ambiguity, it is mandatory that each configuration in the configuration file needs to be assigned a value, otherwise an error will be reported. ## Data filtering redis-shake supports custom filtering rules using lua scripts. redis-shake can be started with the following command: ```shell ./bin/redis-shake redis-shake.toml filter/xxx.lua ``` Some following filter templates are provided in `filter` directory: 1. `filter/print.lua`:print all commands 2. `filter/swap_db.lua`:swap the data of db0 and db1 ### Custom filter rules Refer to `filter/print.lua` to create a new lua script, and implement the filter function in the lua script. The arguments of the function are: - id: command id - is_base: is the command read from the dump.rdb file - group: command group, see the description file under [redis/src/commands](https://github.com/redis/redis/tree/unstable/src/commands) - cmd_name: command name - keys: keys in command - slots: slots in command - db_id: database id - timestamp_ms: timestamp of the command in milliseconds. The current version does not support it. The return value is: - code - 0: allow this command to pass - 1: this command is not allowed to pass - 2: this command should not appear, and let redis-shake exit with an error - db_id: redirected db_id # Contribution ## Lua script Welcome to share more creative lua scripts. 1. Add lua scripts under `filters/`. 2. Add description to `README.md`. 3. Submit a pull request. ## Redis Module support 1. Add code under `internal/rdb/types`. 2. Add a command file under `scripts/commands`, and use the script to generate a `table.go` file and move it to the `internal/commands` directory. 3. Add test cases under `test/cases`. 4. Submit a pull request. # 感谢 redis-shake 旧版是阿里云基于豌豆荚开源的 redis-port 进行二次开发的一个支持 Redis 异构集群实时同步的工具。 redis-shake v3 在 redis-shake 旧版的基础上重新组织代码结构,使其更具可维护性的版本。 redis-shake v3 参考借鉴了以下项目: - https://github.com/HDT3213/rdb - https://github.com/sripathikrishnan/redis-rdb-tools