zoukankan      html  css  js  c++  java
  • 【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;
        }
    }

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

    最后是在自动注入的时候修改了默认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;
        }
    }
  • 相关阅读:
    计算机硬件
    队列、堆、栈、堆栈的区别
    操作系统与应用程序的关系
    DNS与HTTPDNS
    配置静态路由传送网络包
    django的nginx配置
    视频流和文件传输相关协议
    HTTPS 对称加密和非对称加密
    HTTP1.1/2.0与QUIC协议
    mysql join联表 + id自增
  • 原文地址:https://www.cnblogs.com/yeyeck/p/12164350.html
Copyright © 2011-2022 走看看