springboot中使用redis先引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
需要注意的是在2.x版本中这个library中包含了client连接池的,包括jedis和lettuce,所以引入了这个library后可以直接在配置文件中指定要使用的连接池配置而不必重新引入连接池library。另外不同版本的spring-data的配置是不一样的,需要大家区分开,1.x版本配置形如:
spring.redis.database=0
spring.redis.host=192.168.99.100
spring.redis.port=6379
#spring.redis.password= # Login password of the redis server.
spring.redis.pool.max-active=8
spring.redis.pool.max-idle=8
spring.redis.pool.max-wait=-1
spring.redis.pool.min-idle=0
#spring.redis.sentinel.master= # Name of Redis server.
#spring.redis.sentinel.nodes= # Comma-separated list of host:port pairs.
spring.redis.timeout=10
2.x版本形如:
spring.redis.database=0
spring.redis.host=192.168.99.100
spring.redis.port=6379
#spring.redis.password= # Login password of the redis server.
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.min-idle=0
#spring.redis.sentinel.master= # Name of Redis server.
#spring.redis.sentinel.nodes= # Comma-separated list of host:port pairs.
spring.redis.timeout=100ms
连接池的配置上有变化,注意区分,查看官方文档优化配置,不要抄网上众多混乱不堪的配置。
由于Spring Boot的自动配置特性,引入了library后就会自动读取配置并注入所需的类型。如RedisConnectionFactory,StringRedisTemplate,RedisTemplate等,这里需要关注的地方是你可以重新注入Spring自动注入的这些Bean,Spring自动注入的将被替换,但是,RedisTemplate有点特殊,当你注入RedisTemplate时,需要指定name为redisTemplate,否则是无法替换的,同样,当你使用Spring Boot提供的RedisTemplate时,最好也是按名字注入,因为他是泛型类型,当指定的泛型入参不一样时类型是不一样的,切记这其中的道理。
既然Spring Boot都提供了默认的实现,那什么情况下我们才需要替换呢?一般情况下你是不需要替换RedisConnectionFactory的,因为配置里已经提供了完整的配置来让你设置RedisConnectionFactory,你完全没有理由去重写一个,我们来看一下一个重写的例子,不建议你重写,因为没有必要
@Bean
public RedisConnectionFactory connectionFactory() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(maxActive);
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMaxWaitMillis(maxWait);
poolConfig.setMinIdle(minIdle);
poolConfig.setTestOnBorrow(true);
poolConfig.setTestOnReturn(false);
poolConfig.setTestWhileIdle(true);
JedisClientConfiguration clientConfig = JedisClientConfiguration.builder()
.usePooling().poolConfig(poolConfig).and().readTimeout(Duration.ofMillis(redisTimeout)).build();
// 单点redis
RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration();
// 哨兵redis
// RedisSentinelConfiguration redisConfig = new RedisSentinelConfiguration();
// 集群redis
// RedisClusterConfiguration redisConfig = new RedisClusterConfiguration();
redisConfig.setHostName(redisHost);
redisConfig.setPassword(RedisPassword.of(redisAuth));
redisConfig.setPort(redisPort);
redisConfig.setDatabase(redisDb);
return new JedisConnectionFactory(redisConfig,clientConfig);
}
而我们通常会重写RedisTemplate,因为这个的定制化需求还是很常见的,
@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());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}