工作中碰到。现记录一下。
JDK1.8,SpringBoot 2.2.5, Spring-boot-data-starter-redis 2.3.3
keywords:springboot data redis, Lettuce, Sentinel
哨兵模式
根据官方文档
RedisSentinelConfiguration
can also be defined with aPropertySource
, which lets you set the following properties:Configuration Properties
spring.redis.sentinel.master
: name of the master node.
spring.redis.sentinel.nodes
: Comma delimited list of host:port pairs.
spring.redis.sentinel.password
: The password to apply when authenticating with Redis Sentinel
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
application.yml
spring:
application: dev-8090.com
redis:
database: 3
lettuce:
pool:
max-active: 100
max-wait: 15000
max-idle: 100
min-idle: 50
timeout: 15000
sentinel:
master: article_pool_master
nodes: 172.16.111.130:26379,172.16.112.71:26379,172.16.113.125:26379
Config文件
redisProperties提供读取application.yml中的redis配置的方法 -> 手动读取
@Autowired
private RedisProperties redisProperties;
redisTemplate传入RedisConnectionFactory -> 自动注入,自动从application.yml配置
设置序列化后无需手动序列化。
@Configuration
@EnableCaching
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
// 设置序列化
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//指定序列化输入类型
om.activateDefaultTyping(
LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.WRAPPER_ARRAY);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
/* ========= 创建 template ========= */
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setEnableTransactionSupport(true);
template.setKeySerializer(stringRedisSerializer);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
}
Dao层
定义数据库操作
@Component
public class UploadRedisDao implements IUploadRedisDao {
@Autowired
private RedisTemplate redisTemplate;
@Override
public String getUserToken(String key) {
String userToken = redisTemplate.opsForValue().get(key);
String transformedToken = StringEscapeUtils.unescapeJava(userToken);
// System.out.println("userToken: "+transformedToken);
return transformedToken;
}
}
最后在service层调用Dao层定义的操作方法。