前言
最近用springboot做项目用到了redis,第一次使用了yml格式作为配置文件。在这里记录一下我的使用过程,以及出错情况。希望大家节约时间,少踩坑。
正文
第一步,maven导入依赖。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</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文件中此前缀的属性。
下面即是读取配置的类。Getter
、Setter
、NoArgsConstructor
注解都是采用了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就完成了。