【Springboot】Springboot2 集成 redis 踩坑

今天用Springboot2集成redis的时候,一开始是用以前的方法出了很多问题。一查才知道Springboot2使用 lettuce 作为默认的redis client。所以配置文件里别配置jedis的参数了,配置lettuce pool。 还想用 jedis 的需要自己在 pom 文件手动添加 jedis client 的依赖。

redis:
    database: 0
    host: 192.168.1.210
    port: 6379
    password: password
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0

完了还有一个问题就是会报一个错误, 大概就是 

ClassNotFoundException: org.apache.commons.pool2.impl.GenericObjectPoolConfig

需要手动添加 commons pool 的依赖

<!-- redis lettuce pool 需要这个依赖 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.6.2</version>
        </dependency>

最后一个问题就是在自定义 RedisTempelate 的时候, 使用以下代码会报错 Spring 容器中找不到 RedisConnectionFactory 

@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig {

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer<Object> redisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        redisSerializer.setObjectMapper(mapper);
        template.setValueSerializer(redisSerializer);

        template.setKeySerializer(new StringRedisSerializer());
        template.afterPropertiesSet();

        return template;
    }
}

【Springboot】Springboot2 集成 redis 踩坑

但是实际上这个bean是存在的,因为 redis 的默认配置类也使用了这个Bean。 项目跑起来也是报错,RedisConnectionFactory is required

【Springboot】Springboot2 集成 redis 踩坑

最后是在自动注入的时候修改了默认RedisTemplate 的 属性,解决了这个问题。

@Component
public class RedisCenter {

    private RedisTemplate<Object, Object> redisTemplate;

    public void expire(Object key, Object value, long time, TimeUnit unit) {
        redisTemplate.opsForValue().set(key, value, time, unit);
    }

    public Object get(Object key) {
        return redisTemplate.opsForValue().get(key);
    }


    @Autowired
    public void setRedisTemplate(RedisTemplate<Object, Object> redisTemplate) {
        Jackson2JsonRedisSerializer<Object> redisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        redisSerializer.setObjectMapper(mapper);
        redisTemplate.setValueSerializer(redisSerializer);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.afterPropertiesSet();
        this.redisTemplate = redisTemplate;
    }
}

相关推荐