@
目录前言
一、添加依赖
因我的构建cloud项目,这里直接把可能会用的依赖都放到一起
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
二、改好RedisConfig
前提是已经建好Redis的springboot项目,按网上的操作就行。我的是在这基础上操作
package com.ams.common.redis.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
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.RedisServer;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.Redistemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
import java.util.List;
@Configuration
@EnableConfigurationProperties(RedisProperties.class)
public class RedisConfig {
private final RedisProperties properties;
public RedisConfig(RedisProperties properties){
this.properties = properties;
}
@Bean
public Redistemplate<String, Object> redistemplate() {
Redistemplate<String, Object> redistemplate = new Redistemplate<>();
redistemplate.setConnectionFactory(getConnectionFactory());
// 用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redistemplate.setKeySerializer(stringRedisSerializer); // key
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
// 指定要序列化的域(field,get,set),访问修饰符(public,private,protected)
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setobjectMapper(objectMapper);
redistemplate.setValueSerializer(jackson2JsonRedisSerializer); //value
redistemplate.setHashKeySerializer(stringRedisSerializer);
redistemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redistemplate.afterPropertiesSet();
return redistemplate;
}
@Bean
public RedisConnectionFactory getConnectionFactory() {
//哨兵模式
RedisSentinelConfiguration configuration = new RedisSentinelConfiguration();
configuration.setMaster(properties.getSentinel().getMaster());
configuration.setPassword(properties.getpassword());
configuration.setDatabase(properties.getDatabase());
List<String> nodes = properties.getSentinel().getNodes();
nodes.forEach(node -> {
String[] str = node.split(":");
RedisNode redisServer = new RedisServer(str[0], Integer.parseInt(str[1]));
configuration.sentinel(redisServer);
});
LettuceConnectionFactory factory = new LettuceConnectionFactory(configuration, getPool());
//使用前先校验连接,这个最好是要配置:不然会带来connection reset by peer
factory.setValidateConnection(true);
return factory;
}
@Bean
public LettuceClientConfiguration getPool() {
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
//redis客户端配置:超时时间默认
LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder
builder = LettucePoolingClientConfiguration.builder().
commandTimeout(Duration.ofMillis(60000));
//连接池配置
RedisProperties.Pool pool = properties.getLettuce().getPool();
genericObjectPoolConfig.setMaxIdle(pool.getMaxIdle());
genericObjectPoolConfig.setMinIdle(pool.getMinIdle());
genericObjectPoolConfig.setMaxTotal(pool.getMaxActive());
genericObjectPoolConfig.setMaxWaitMillis(pool.getMaxWait().toMillis());
builder.shutdownTimeout(Duration.ofMillis(4000));
builder.poolConfig(genericObjectPoolConfig);
return builder.build();
}
三、修改nacos中Redis的配置
redis:
sentinel:
master: master
nodes: 192.168.2.237:6776,192.168.2.37:6777,192.168.2.37:6778
password: 123456
timeout: 1000
database: 3
lettuce:
pool:
max-active: 8
max-wait: 1000
max-idle: 8
min-idle: 0
四、其他
1.踩到的坑如下:
java一直无法连接sentinel,关闭防火墙也不行
解决方法:因为之前redis配置的防火墙打开,开放端口,所以这里也不能关闭防火墙,而是要开放sentinel的几个端口。
随心所往,看见未来。Follow your heart,see night!
欢迎点赞、关注、留言,一起学习、交流!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。