最近项目里用到了redis,需要做连接池管理。网上搜了一圈,大部分都是用xml实现的,在spring-boot工程里,其实已经不鼓励用xml来做bean的实现了。所以自己用注解实现了一个简易的redis容器管理。
1.application.properties
redis.server1=127.0.0.1
redis.port1=6379
redis.server2=127.0.0.1
redis.port2=6379
redis.maxActive=100
redis.maxIdle=50
redis.maxWait=100
redis.timeout=500
指定了一些参数,按需调整;两个链接host和port的信息,地址配成一样的了,可以根据使用按需增减。
2. RedisConfig.java
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* Created by *** on 2019/1/3
*
* @description
*/
@Component
@ConfigurationProperties(prefix = RedisConfig.PREFIX)
public class RedisConfig {
public static final String PREFIX = "redis";
private String server1;
private int port1;
private String server2;
private int port2;
private int maxActive;
private int maxIdle;
private int maxWait;
private int timeout;
public String getServer1() {
return server1;
}
public void setServer1(String server1) {
this.server1 = server1;
}
public int getPort1() {
return port1;
}
public void setPort1(int port1) {
this.port1 = port1;
}
public String getServer2() {
return server2;
}
public void setServer2(String server2) {
this.server2 = server2;
}
public int getPort2() {
return port2;
}
public void setPort2(int port2) {
this.port2 = port2;
}
public int getMaxActive() {
return maxActive;
}
public void setMaxActive(int maxActive) {
this.maxActive = maxActive;
}
public int getMaxIdle() {
return maxIdle;
}
public void setMaxIdle(int maxIdle) {
this.maxIdle = maxIdle;
}
public int getMaxWait() {
return maxWait;
}
public void setMaxWait(int maxWait) {
this.maxWait = maxWait;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
}
用来从配置中注入文件的类
3.RedisConfContainer
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPoolConfig;
/**
* Created by *** on 2019/1/3
*
* @description
*/
@Configuration
public class jedisConfContainer {
@Autowired
RedisConfig redisConfig;
@Bean
JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxActive(redisConfig.getMaxActive());
jedisPoolConfig.setMaxIdle(redisConfig.getMaxIdle());
jedisPoolConfig.setMaxWait(redisConfig.getMaxWait());
System.out.println("[JEDIS] 0");
return jedisPoolConfig;
}
}
redis通用配置的容器
4. JedisBeansContainer
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* Created by *** on 2019/1/3
*
* @description
*/
@Configuration
public class JedisBeansContainer1 {
@Autowired
RedisConfig redisConfig;
@Autowired
JedisPoolConfig jedisPoolConfig;
@Bean(name = "myRedisPool2", destroyMethod = "destroy")
@Qualifier("myRedisPool")
@DependsOn("jedisPoolConfig")
JedisPool myRedisPool1() {
System.out.println("[JEDIS] 1");
return new JedisPool(jedisPoolConfig, redisConfig.getServer1(), redisConfig.getPort1(), redisConfig.getTimeout());
}
@Bean(name = "myRedisPool1", destroyMethod = "destroy")
@Qualifier("myRedisPool")
@DependsOn("jedisPoolConfig")
JedisPool myRedisPool2() {
System.out.println("[JEDIS] 2");
return new JedisPool(jedisPoolConfig, redisConfig.getServer2(), redisConfig.getPort2(), redisConfig.getTimeout());
}
}
用来存放连接的bean容器
5.RedisPools
import org.apache.commons.lang.math.RandomUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import java.util.List;
@Component
public class RedisPools {
@Autowired
@Qualifier("myRedisPool")
List<JedisPool> jedisPools;
/**
* 获取链接
*/
public RedisHolder getJedisPool() {
int index = RandomUtils.nextInt(jedisPools.size());
Jedis jedis = jedisPools.get(index).getResource();
return new RedisHolder(index, jedis);
}
/**
* 释放链接
*/
public void returnJedis(RedisHolder jedisPool) {
jedisPools.get(jedisPool.getPoolIndex()).returnResource(jedisPool.getJedis());
}
}
class RedisHolder {
private int poolIndex;
private Jedis jedis;
public int getPoolIndex() {
return poolIndex;
}
public void setPoolIndex(int poolIndex) {
this.poolIndex = poolIndex;
}
public Jedis getJedis() {
return jedis;
}
public void setJedis(Jedis jedis) {
this.jedis = jedis;
}
public RedisHolder() {
}
public RedisHolder(int poolIndex, Jedis jedis) {
this.poolIndex = poolIndex;
this.jedis = jedis;
}
}
获取链接和释放的入口。
省略了很多异常检查和日志的内容,使用的时候要注意链接获取和释放一定是成对出现的(可以用try-finally实现)