java redis的同步_学习redis(2)复制数据,同步数据

虽然Redis提供了持久化的功能保证了在Redis服务器重启时数据不会丢失,但保存在磁盘上的数据文件依旧有可能因为磁盘损坏而丢失,所以Redis提供了复制功能来在多台Redis服务器上同步数据,这样即使有一台Redis服务器保存数据的文件损坏,数据也不会丢失。

同步后的Redis数据库分为两类:主数据库(master),从数据库(slave),它们结构如下图:

857afce0b3aa9de8c92b876fd6b13ab2.png

主从关系是相对的,对于A、B、C三个数据库来说,A是主数据库,而B、C是从数据库,而对于B、D、E来说,B又是主数据库,D、E是从数据库。主从数据库数据的流向只能顺着箭头方向,例如,在A中执行set username yamikaze,那么在B、C、D等数据库中使用get username都能得到数据,而在B中使用set age 11,在D、E、F中能得到数据,但在A、C中返回是(nil)。

同时在A中set username后,从数据库只能查看,而不能修改。最后,从数据库只能与一个主数据库相关联。

实现主从同步

Redis的主从同步配置很简单,只需要在从数据库的配置文件中加入配置。slaveof 主数据库ip 主数据库端口即可,主数据库不用做任何配置。

也可以启动数据库然后,执行指令slaveof host port进行管理。如果重复执行这个指令,且host port正确,Redis会断开与原主数据库的连接,然后与指定的host建立连接。

我们启动多个redis实例,假设redis实例的ip:port分别为:

127.0.0.1:6379

127.0.0.1:6340

127.0.0.1:6350

我们设置 6379为主库,6340为6379的从库,6350为6340的从库。

那么,实例全部启动后,输入指令:

127.0.0.1:6340> slaveof 127.0.0.1 6379

127.0.0.1:6350> slaveof 127.0.0.1 6340

就完成了redis数据库之间的主从关联配置。

当主库,set了一个string对象后:

127.0.0.1:6379> set username test

OK

在从库里查询该对象:

127.0.0.1:6340> get username

test

可以看到从库同步到了主库的数据,那么我们修改从库的数据:

127.0.0.1:6340> set username test2

(error) READONLY you can't write against a read only slave.

可以看到在从数据库中无法修改从主数据库同步过来的数据,可以修改配置文件中的slave-read-only从yes改为no,然后重启该实例,再进行以上操作。可以看到修改成功,但主数据库数据没有发生改变。

然后主数据库进行的每一个写指令都将传递给从服务器,所以在主服务器删除了username,从服务器也会删除username。

注意:如果主数据库配置了密码(在配置文件加上了requirepass 密码),那么在从数据库的配置文件中要加上masterauth 密码,然后从数据库会自动调用AUTH指令进行认证。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值