有时我们可能需要手动配置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; }