有时我们可能需要手动配置Redis的连接,例如动态修改或是从特殊的参数中获取,而不是使用SpringBoot的自有配置,此篇文章意在快速指引redis的手动配置。基于Spring项目和Jedis的底层,使用RedisTemplate;
引入相关依赖
通过Maven引入相关依赖,可以的话spring-data-redis选择2.0.0以上版本,较低版本需要的依赖:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <!--引入org.springframework.boot.spring-boot-starter-data-redis也可以 但是无法使用Lettuce--> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>2.0.5</version> </dependency>
如果使用了Spring-boot并且要使用较高的版本(例如在2.1.0后才有的某些API-putIfAbsent带有超时时间的版本),我们直接修改starter的版本是不够的,二者版本并不对称,我们需要去掉其中的redis依赖并单独引入。建议保持良好的依赖管理习惯,显式的移除依赖,而不是任其覆盖,如:
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>2.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.2.0.RELEASE</version> <!-- 实际的此依赖版本是2.0.5 API较旧所以移除 --> <exclusions> <exclusion> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> </exclusion> </exclusions> </dependency>
直接使用配置文件
毕竟SpringBoot都为我们准备好了,如果配置文件可以解决问题,可以直接配置:
applicaion.yml
redis: database: 0 pool: max-active: 1000 max-wait: -1 max-idle: 20 #主从配置 # sentinel: # master: master # nodes: 10.0.0.2:6379,,10.0.0.3:6379 host: 10.0.0.1 port: 6379 password: "xxx"
bean配置类(Spring-data-redis >= v2.0)
在2.0之后的版本的ConnectionFactory中标注了一些方法过时,例如配置Redis连接池的类,建议使用新的配置类替换,以下是一个从环境变量中读取相关redis连接的配置方式:
@Configuration
public class RedisConfig {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Bean
public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPool,
RedisStandaloneConfiguration jedisConfig) {
//配置使用连接池,如果用默认的连接池策略直接builder.build()即可
JedisClientConfiguration jedisClientConfiguration =
JedisClientConfiguration.builder().usePooling().poolConfig(jedisPool).build();
return new JedisConnectionFactory(jedisConfig, jedisClientConfiguration);
}
/**
* 定义redis连接池参数,详细参数配置请查阅资料
* */
@Bean
public JedisPoolConfig jedisPool() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(100);
jedisPoolConfig.setMaxWaitMillis(1000);
jedisPoolConfig.setMaxTotal(100);
jedisPoolConfig.setMinIdle(10);
return jedisPoolConfig;
}
/**
* 配置Redis的连接,从系统环境变量中取值
* 使用单机部署配置
* */
@Bean
public RedisStandaloneConfiguration jedisConfig() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
int port=(null==System.getenv("REDIS_PORT")?6379:new Integer(System.getenv("REDIS_PORT")));
String hostName=(null==System.getenv("REDIS_HOST")?"127.0.0.1":System.getenv("REDIS_HOST"));
String password=(null==System.getenv("REDIS_PSWD")?null:System.getenv("REDIS_PSWD"));
logger.info("Init redis connection - port:{},host:{}",port,hostName);
config.setHostName(hostName);
config.setPort(port);
config.setDatabase(0);
config.setPassword(RedisPassword.of(password));
return config;
}
/**
* 此处配置了处理字符串的StringRedisTemplate,如果也需要RedisTemplate,按需配置
* */
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
//do more... 还可以定义一些诸如序列化的配置
//Configuration不需要显式的调用,但是如果你是作为一个Util类,需要调用这个方法后才可以使用
//stringRedisTemplate.afterPropertiesSet();
return stringRedisTemplate;
}
}
这样直接注入SpringRedisTemplate相应的bean就可以应用配置了。
bean配置类(Spring-data-redis < v2.0)
在低版本中没有RedisStandaloneConfiguration这样的配置,JedisPool的配置也有所不同,可省略RedisStandaloneConfiguration,其余方法不变:
@Bean
public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPool) {
JedisConnectionFactory jedisConnectionFactory=new JedisConnectionFactory();
jedisConnectionFactory.setUsePool(true);
jedisConnectionFactory.setPoolConfig(jedisPool);
jedisConnectionFactory.setHostName();
jedisConnectionFactory.setPassword();
jedisConnectionFactory.setDatabase();
jedisConnectionFactory.setPort();
return jedisConnectionFactory;
}


2020-02-24鱼鱼