Redis 主从复制、哨兵、集群模式
单节点模式
SpringBoot整合
@Bean(name = "singleClient")
public RedissonClient singleRedissonClient() {
try {
Config config = new Config();config.useSingleServer().setAddress("redis://" + redisProperties.getUrl() + ":" + redisProperties.getPort()).setDatabase(1);// 设置序列化方式Codec codec = new JsonJacksonCodec();config.setCodec(codec);RedissonClient redissonClient = Redisson.create(config);redissonClient.getBucket("one").set("one");logger.info("==========> singleRedissonClient()配置完成!");return redissonClient;} catch (Exception e) {
logger.info("==========> singleRedissonClient() 出错:" + e.getMessage());return null;}
}
主从复制
配置方式
主节点配置不变,从节点配置信息加上slaveof 127.0.0.1 9000
服务器地址和端口。
特点
- 一个master可以有多个slave。
- slave之间也可以互相同步。简单点说就是备份数据库,防止了数据的丢失等。
- 可以用于读写分离和恢复丢失的数据。
- 需要手动去配置主从节点,加入主节点挂了,需要重新定义主节点。
SpringBoot整合
/*** 主从模式*/
@Bean(name = "masterSlaveClient")
@Primary
public RedissonClient masterSlaveClient() {
try {
Config config = new Config();config.useMasterSlaveServers().setMasterAddress("redis://127.0.0.1:6379").addSlaveAddress("redis://127.0.0.1:6380");RedissonClient redissonClient = Redisson.create(config);redissonClient.getBucket("masterSlaveClient").set("masterSlaveClient");logger.info("==========> masterSlaveClient()配置完成!");return redissonClient;} catch (Exception e) {
logger.info("==========> masterSlaveClient() 出错:" + e.getMessage());return null;}
}
哨兵模式
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是**哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。**简单来说,就是替代了人工手动方式切换主节点的操作。
哨兵的作用
-
通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
-
当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
/*** 哨兵模式*/
@Bean(name = "sentryClient")
public RedissonClient sentryClient(){
try{
Config config = new Config();// 需要启动/redis-sentinelconfig.useSentinelServers().setMasterName("mymaster").addSentinelAddress("redis://127.0.0.1:6379").addSentinelAddress("redis://127.0.0.1:6380");RedissonClient redissonClient = Redisson.create(config);redissonClient.getBucket("sentryClient").set("sentryClient");logger.info("==========> sentryClient()配置完成!");return redissonClient;}catch (Exception e){
logger.info("==========> sentryClient() 出错:" + e.getMessage());}return null;
}
集群模式
需要开启Redis的集群模式,不然会报错。采用集群,就是分布式存储。即每台redis存储不同的内容。 集群至少需要3主3从,且每个实例使用不同的配置文件,主从不用配置,集群会自己选。通过集群模式提供多个master主节点,每个节点都可以读写,节点之间可以互相通信;整个集群无中心节点。
集群模式特点
- 自动将数据进行分片,每个 master 上放一部分数据。
- 提供内置的高可用支持,部分 master 不可用时,还是可以继续工作的。
/*** 集群模式*/
@Bean(name = "clustersClient")
public RedissonClient clustersClient(){
try{
Config config = new Config();config.useClusterServers().setScanInterval(2000).addNodeAddress("redis://127.0.0.1:6379").addNodeAddress("redis://127.0.0.1:6382")// ..// ..// ...addNodeAddress("redis://127.0.0.1:6381");RedissonClient redissonClient = Redisson.create(config);redissonClient.getBucket("clustersClient").set("clustersClient");logger.info("==========> clustersClient()配置完成!");return redissonClient;}catch (Exception e){
logger.info("==========> clustersClient() 出错:" + e.getMessage());}return null;
}