Redis-replicator 一款专注redis数据同步的工具

2,870 阅读2分钟

项目地址

redis-replicator

视频介绍

051.Java版Redis-Replicator

文字简介

Redis-replicator 用 Java 实现了 Reids 的主从同步协议, 模拟 Slave 的行为接收 Master 的数据。 同时也可实现 Rdb 文件的解析以及分割一个 Rdb 文件到多个文件, 合并多个 Rdb 文件到一个。 以及 Aof 数据的解析和 Master 数据的异地备份。

Redis-replicator-2.3.0 以上可支持 Redis-2.6.x 至 Redis-4.0.x 之间的所有版本(包括Redis-4.0.x 的 Module)

此项目优缺点

优点:独立jar,仅依赖commons-logging,打包之后仅297 KB;可以内嵌到任何工程中,基本无 jar 包冲突。

缺点:仅支持点对点同步,而且各种扩展需要自己实现,没有一站式解决方案。

竞品比较

与此项目类似,市面上还有其他几个项目实现类似功能

redis-rdb-tool (不支持数据同步功能)

x-pipe (不够轻量级,各有利弊,HA以及监控方面比此项目好)

redis-migrate-tool(C语言实现,不支持 Redis-4.0.x 的 Module 扩展,但支持集群同步)

快速开始

一个典型的同步场景如下代码所示

     Replicator replicator = new RedisReplicator("127.0.0.1", 6379, Configuration.defaultSetting());
        replicator.addRdbListener(new RdbListener.Adaptor() {
            @Override
            public void handle(Replicator replicator, KeyValuePair<?> kv) {
                System.out.println(kv);
            }
        });
        replicator.addCommandListener(new CommandListener() {
            @Override
            public void handle(Replicator replicator, Command command) {
                System.out.println(command);
            }
        });
        replicator.open();

命令扩展

当有新的 Redis 版本;并增加了新的 Redis 命令而 Redis-replicator未包含此命令时。 用户可以自行扩展命令, 如下形式的扩展。

 // 实现未包含的命令 
    public class YourAppendCommand implements Command {
        public final String key;
        public final String value;
        public YourAppendCommand(String key, String value) {
            this.key = key;
            this.value = value;
        }
    }

    // 为命令写一个解析器
    public class YourAppendParser implements CommandParser<YourAppendCommand> {
        @Override
        public YourAppendCommand parse(Object[] command) {
            return new YourAppendCommand(new String((byte[]) command[1], UTF_8), new String((byte[]) command[2], UTF_8));
        }
    }

    // 注册命令解析器到 Replicator 上
    Replicator replicator = new RedisReplicator("127.0.0.1",6379,Configuration.defaultSetting());
    replicator.addCommandParser(CommandName.name("APPEND"),new YourAppendParser());

    // Handle 此命令的事件
    replicator.addCommandListener(new CommandListener() {
        @Override
        public void handle(Replicator replicator, Command command) {
            if(command instanceof YourAppendCommand){
                YourAppendCommand appendCommand = (YourAppendCommand)command;
                // your code goes here
            }
        }
    });

模块扩展

在 Redis-4.0.x 中, 增加了模块支持,可以用户自定义命令以及 Rdb 存储格式,与上面的命令扩展类似,Module 扩展与之不同的地方在于,需要实现Module接口,以及ModuleParser接口,并通过Replicator.addModuleParser注册此接口。

谁在使用

到目前为止,有东方财富网51信用卡incubator-rocketmq-externals,等公司或开源项目使用或打算使用此项目。