1、下载redis
(1).redis下载地址:
(2).解压到文件夹
将下载的压缩包解压到指定的文件夹中,如:E:\Redis01,内容如下:
2、把安装包复制到两台服务器上面
新建startup6379.bat文件
redis-server.exe ./redis.windows.conf 用于启动master 6379
同样在从服务器也新建一个startup6380.bat 用于启动redis 6380
修改从服务器redis.windows.conf文件
port 6380
slaveof 10.10.17.202 6379
3、测试主从模式
4、哨兵配置
在主从模式搭建成功之后
哨兵配置
每一个redis节点目录中都创建一个文sentinel.conf文件
Master 6379的sentinel.conf文件配置如下:
port 26379
sentinel monitor mymaster 10.10.17.202 6379 1
Slave 6380中的sentinel.conf文件配置
port 26380
sentinel monitor mymaster 10.10.17.202 6379 1
每个Redis目录下新建startup_sentinel.bat
redis-server.exe sentinel.conf --sentinel
启动Redis
6379
6380
启动sentinel
执行startup_sentinel.bat文件
启动redis-cli.exe
redis-cli -p 6379
info replication
redis-cli -p 6380
info replication
启动sentinel
redis-cli.exe -p 26379
info sentinel
5、redis主从自动failover测试
1、停止6379
2、查看6380 可以看到6380变为了master
由此可见实现了主从切换
redis-cli.exe -p 6380
info replication
3、再查看sentinel
redis-cli.exe -p 26379
info sentinel
6、springboot整合redis哨兵
导入依赖
<!-- Redis依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
yml配置:
spring:
redis:
database: 0
host: 192.168.0.186
port: 6379
password:
pool:
jedis:
max-active: 30
max-wait: -1
max-idle: 30
min-idle: 0
sentinel:
master: mymaster # Redis主节点的名称
nodes: # Redis Sentinel监视的节点列表
- 192.168.0.186:26379
- 192.168.0.186:26380
RedisConfig配置类
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig {
/**
* 配置自定义redisTemplate
*
* @return
*/
@Bean
RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(mapper);
template.setValueSerializer(serializer);
//使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
// hash的value也采用jackson的序列化
template.setHashKeySerializer(new StringRedisSerializer());
//hash的value也采用jackson的序列化
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
/**
* 配置读写分离
* @param redisProperties
* @return
*/
@Bean
public RedisConnectionFactory lettuceConnectionFactory(RedisProperties redisProperties) {
if (redisProperties.getSentinel() != null && redisProperties.getSentinel().getNodes() != null
&& !redisProperties.getSentinel().getNodes().isEmpty()
&& redisProperties.getSentinel().getMaster() != null) {
// 配置哨兵节点以及主节点
RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration(
redisProperties.getSentinel().getMaster(), new HashSet<>(redisProperties.getSentinel().getNodes())
);
if (redisProperties.getPassword() != null) {
redisSentinelConfiguration.setPassword(redisProperties.getPassword());
}
// 配置读写分离
LettucePoolingClientConfiguration lettuceClientConfiguration = LettucePoolingClientConfiguration.builder()
// 读写分离,这里的ReadFrom是配置Redis的读取策略,是一个枚举,包括下面选择
// MASTER 仅读取主节点
// MASTER_PREFERRED 优先读取主节点,如果主节点不可用,则读取从节点
// REPLICA_PREFERRED 优先读取从节点,如果从节点不可用,则读取主节点
// REPLICA 仅读取从节点
// NEAREST 从最近节点读取
// ANY 从任意一个从节点读取
.readFrom(ReadFrom.MASTER_PREFERRED)
.build();
return new LettuceConnectionFactory(redisSentinelConfiguration, lettuceClientConfiguration);
} else {
// 没有配置 Sentinel,使用单节点连接方式
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(redisProperties.getHost());
redisStandaloneConfiguration.setPort(redisProperties.getPort());
redisStandaloneConfiguration.setPassword(RedisPassword.of(redisProperties.getPassword()));
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration);
lettuceConnectionFactory.afterPropertiesSet(); // 手动触发初始化
return lettuceConnectionFactory;
}
}
}