SpringBoot下集成redis配置application.yml文件

前言

最近用springboot做项目用到了redis,第一次使用了yml格式作为配置文件。在这里记录一下我的使用过程,以及出错情况。希望大家节约时间,少踩坑。

正文

第一步,maven导入依赖。

<dependency>
  <groupId>redis.clientsgroupId>
  <artifactId>jedisartifactId>
dependency>

第二步,配置application.yml文件的redis配置。

spring: 
 # redis
 redis:
   host: 127.0.0.1
   port: 6379
   timeout: 3
   # password:
   pool:
     minIdle: 1
     maxIdle: 10
     maxWait: 3
     maxActive: 8

这里尤其要注意yml文件的书写格式。冒号 : 后面一定要接一个空格,才可以跟上值,否则就会格式错误的。还有就是尤其要注意缩进(用空格作缩进),yml所有的级别关系都是由缩进完成,这点是它和xml的不同之处。比如这里的redis是属于spring下的子集,而host、port、timeout、pool又是redis的子集,那么如果用.properties文件来写的话,这里的host就应该写成spring.redis.host

第三步,在springboot中添加读取redis配置类。
springboot自己有一种强大的读取配置的注解@ConfigurationProperties,只需要在相应的类上添加此注解,标明前缀,即可自动读取yml文件中此前缀的属性。
下面即是读取配置的类。GetterSetterNoArgsConstructor注解都是采用了lombok简化代码的结果,就是省略了手动生成getter、setter、构造方法的步骤。关于lombok,可以查看我的另一篇博客:lombok插件。

/**
 * Created by makersy on 2019
 */

@Component
@ConfigurationProperties(prefix = "spring.redis")
@Getter
@Setter
@NoArgsConstructor
public class RedisConfig {

    private String host;

    private int port;

    private int timeout;//秒

    private String password;

    private HashMap<String, String> pool = new HashMap<>();

}

需要注意的是,pool之下还有子集,然而我们的前缀设定的是spring.redis,如果还要把pool之下的那些属性名都写上来,那么肯定是读取不到的(我一开始就是这么做的…)。这里采用的办法就是用一个HashMap来存储pool这个属性集合,要取对应的值就用Hashmap的get(属性名)方法即可。

第四步,封装获取连接池类。这个类可以读取yml文件中的redis配置,并生成一个具有这些属性的JedisPool。可以将获取对应属性的代码和上面yml的属性设置联合起来看。

/**
 * Created by makersy on 2019
 */

@Service
public class RedisPoolFactory {
    @Autowired
    RedisConfig redisConfig;

    @Bean
    public JedisPool JedisFactory() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(Integer.valueOf(redisConfig.getPool().get("maxActive")));
        poolConfig.setMaxIdle(Integer.valueOf(redisConfig.getPool().get("maxIdle")));
        poolConfig.setMaxWaitMillis(Integer.valueOf(redisConfig.getPool().get("maxWait")) * 1000);  //注意单位是ms,要转换单位
        poolConfig.setMinIdle(Integer.valueOf(redisConfig.getPool().get("minIdle")));
        return new JedisPool(poolConfig, redisConfig.getHost(), redisConfig.getPort(),
                redisConfig.getTimeout()*1000, redisConfig.getPassword(), 0);
    }

    
}

结语

到此为止,整合springboot与redis就完成了。

你可能感兴趣的:(数据库,Spring)