集群redis哨兵模式连接方式,解决database不生效问题(附源码)
问题背景
公司里面项目基本都使用哨兵模式
注意事项:
- 默认已安装redis
- 可以根据代码自己创建工程,也可以下载源码进行参考
项目搭建
1 引入pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yg</groupId>
<artifactId>redis-sentinel</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>redis-sentinel</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
2 添加redis哨兵配置,database主动设置,才会生效
package com.yg.redissentinel.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisNode;
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;
import java.util.HashSet;
import java.util.Set;
@Configuration
public class RedisConfig {
@Value("${spring.redis.password}")
public String password;
@Value("${spring.redis.sentinel.nodes}")
public String nodes;
@Value("${spring.redis.sentinel.master}")
public String master;
@Value("${spring.redis.database}")
public int database; //主动设置,才会生效
@Bean
public JedisPoolConfig jedisPoolConfig(){
return new JedisPoolConfig();
}
@Bean
public RedisSentinelConfiguration sentinelConfiguration(){
RedisSentinelConfiguration sentinelConfiguration = new RedisSentinelConfiguration();
Set<RedisNode> redisNodes = new HashSet<>();
//ip和端口信息可以写在配置文件里
if (StringUtils.isNotEmpty(nodes)){
final String[] split = nodes.split(",");
if (ArrayUtils.isNotEmpty(split)){
for (String ipPort : split) {
if (StringUtils.isEmpty(ipPort)){
continue;
}
final String[] split1 = ipPort.split(":");
if (2 == split1.length){
RedisNode redisNode = new RedisNode(split1[0],Integer.parseInt(split1[1]));
redisNodes.add(redisNode);
}
}
}
}
//setSentinels的参数类型是Iterable<RedisNode>,所以放有RedisNode的集合可以是实现Iterable接口的任意集合,使用list、set都可以
sentinelConfiguration.setSentinels(redisNodes);
//监控主节点的名称
sentinelConfiguration.setMaster(master);
sentinelConfiguration.setPassword(password);
sentinelConfiguration.setDatabase(database);
return sentinelConfiguration;
}
/**
* 连接工厂配置信息,需要注入连接池配置信息
* @param jedisPoolConfig
* @return
*/
@Bean
public JedisConnectionFactory jedisConnectionFactory(RedisSentinelConfiguration redisSentinelConfiguration, JedisPoolConfig jedisPoolConfig){
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisSentinelConfiguration,jedisPoolConfig);
return jedisConnectionFactory;
}
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
3 application.yml配置
spring:
redis:
password: 123456
database: 1
sentinel:
master: mymaster
nodes: 10.10.195.249:6379,10.10.195.249:6380,10.10.195.249:6381
timeout: 3000
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.7.0)
2022-05-20 17:49:58.232 INFO 60192 --- [ main] c.y.r.RedisSentinelApplication : Starting RedisSentinelApplication using Java 1.8.0_221 on B-YUAN-G with PID 60192 (D:\code\csdn\redis-sentinel\target\classes started by yuan.g in D:\code\csdn\redis-sentinel)
2022-05-20 17:49:58.238 INFO 60192 --- [ main] c.y.r.RedisSentinelApplication : No active profile set, falling back to 1 default profile: "default"
2022-05-20 17:49:58.770 INFO 60192 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2022-05-20 17:49:58.771 INFO 60192 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2022-05-20 17:49:58.786 INFO 60192 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 4 ms. Found 0 Redis repository interfaces.
2022-05-20 17:49:59.094 INFO 60192 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2022-05-20 17:49:59.101 INFO 60192 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-05-20 17:49:59.101 INFO 60192 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.63]
2022-05-20 17:49:59.208 INFO 60192 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-05-20 17:49:59.208 INFO 60192 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 918 ms
2022-05-20 17:49:59.283 INFO 60192 --- [ main] redis.clients.jedis.JedisSentinelPool : Trying to find master from available Sentinels...
2022-05-20 17:49:59.312 INFO 60192 --- [ main] redis.clients.jedis.JedisSentinelPool : Redis master running at 10.10.195.249:7001, starting Sentinel listeners...
2022-05-20 17:49:59.314 INFO 60192 --- [ main] redis.clients.jedis.JedisSentinelPool : Created JedisSentinelPool to master at 10.10.195.249:6379
2022-05-20 17:49:59.764 INFO 60192 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2022-05-20 17:49:59.772 INFO 60192 --- [ main] c.y.r.RedisSentinelApplication : Started RedisSentinelApplication in 1.953 seconds (JVM running for 3.28)
可以看到redis.clients.jedis.JedisSentinelPool : Created JedisSentinelPool to master at 10.10.195.249:6379已经启动了
总结
- 通过程序快速连接,可以使用客户端连接
作为程序员第 140 篇文章,每次写一句歌词记录一下,看看人生有几首歌的时间,wahahaha …
Lyric: 模糊了视线
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/110735.html