在Springboot升级到2.0之后,Redis的配置相比于2.0以前有了特别大的变化,我也初学Springboot2.0,确定有写得不太对的地方,但愿能让阅读这篇帖子的朋友们都有所收获,本文中的springboot版本为:2.2.0.BUILD-SNAPSHOTjava在springboot2.0之后,redis的配置给个人印象主要有两种方式,一是使用standalone方式,就是传统基于jedis的配置,二是使用Lettuce方式,基于netty作的通讯,为springboot2.0的新方式,推荐使用lettuce方式,通过批量set和delete的测试(直接使用RedisTemplate的delete方法和opsFor中的set方法),后者的效率比前者要高出一倍左右。redis
在本文中无论是standalone仍是lettuce方式均使用apache的commons-pool2中提供的GenericObjectPoolConfig实例作为redis的链接池,放弃使用jedisPoolConfig。spring
pom中配置Redis必需要有引用:apache
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
Spring的配置文件application.yml:springboot
因为是手动配置多个Redis链接实例,因此必需要注意pool和redia-a/b/c下的变量名称,和springboot的auto-cofing名称有出入app
spring:
redis:
lettuce:
pool:
MaxTotal: 50
minIdle: 1
maxWaitMillis: 5000
maxIdle: 5
testOnBorrow: true
testOnReturn: true
testWhileIdle: true
redis-a:
database: 0
hostName: 192.168.0.88
port: 6379
timeout: 5000
redis-b:
database: 1
hostName: ${spring.redis.redis-a.hostName}
port: ${spring.redis.redis-a.port}
timeout: ${spring.redis.redis-a.timeout}
redis-c:
database: 2
hostName: ${spring.redis.redis-a.hostName}
port: ${spring.redis.redis-a.port}
timeout: ${spring.redis.redis-a.timeout}
standalone方式配置多个redis链接实例,在使用redis的standalone方式时,须要额外在pom中引入jedis客户端,反正个人须要,虽然我在spring-boot-starter-data-redis这个starter的pom中看到有引入jedis,可是在个人这个demo中并无把jedis import进来spring-boot
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
RedisTemplate的配置:测试
@Configuration
public class StandaloneRedisConfig {
@Bean
@ConfigurationProperties(prefix = "spring.redis.lettuce.pool")
@Scope(value = "prototype")
public GenericObjectPoolConfig redisPool(){
return new GenericObjectPoolConfig();
}
@Bean
@ConfigurationProperties(prefix = "spring.redis.redis-a")
public RedisStandaloneConfiguration standaloneConfigurationA() {
return new RedisStandaloneConfiguration();
}
@Bean
@ConfigurationProperties(prefix = "spring.redis.redis-b")
public RedisStandaloneConfiguration standaloneConfigurationB() {
return new RedisStandaloneConfiguration();
}
@Bean
@ConfigurationProperties(prefix = "spring.redis.redis-c")
public RedisStandaloneConfiguration standaloneConfigurationC() {
return new RedisStandaloneConfiguration();
}
@Bean
public JedisConnectionFactory standaloneFactoryA(){
JedisClientConfiguration poolConfig = JedisClientConfiguration.builder().usePooling().poolConfig(redisPool()).build();
return new JedisConnectionFactory(standaloneConfigurationA(), poolConfig);
}
@Bean
public JedisConnectionFactory standaloneFactoryB(){
JedisClientConfiguration poolConfig = JedisClientConfiguration.builder().usePooling().poolConfig(redisPool()).build();
return new JedisConnectionFactory(standaloneConfigurationB(), poolConfig);
}
@Bean
public JedisConnectionFactory standaloneFactoryC(){
JedisClientConfiguration poolConfig = JedisClientConfiguration.builder().usePooling().poolConfig(redisPool()).build();
return new JedisConnectionFactory(standaloneConfigurationC(), poolConfig);
}
@Bean
public RedisTemplate StringRedisTemplateA(){
RedisTemplate<String, String> template = getRedisTemplate();
template.setConnectionFactory(standaloneFactoryA());
return template;
}
@Bean
public RedisTemplate StringRedisTemplateB(){
RedisTemplate<String, String> template = getRedisTemplate();
template.setConnectionFactory(standaloneFactoryB());
return template;
}
@Bean
public RedisTemplate StringRedisTemplateC(){
RedisTemplate<String, String> template = getRedisTemplate();
template.setConnectionFactory(standaloneFactoryC());
return template;
}
private RedisTemplate<String, String> getRedisTemplate(){
RedisTemplate<String, String> template = new RedisTemplate<>();
template.setValueSerializer(new GenericFastJsonRedisSerializer());
template.setValueSerializer(new StringRedisSerializer());
return template;
}
}
lettuce方式不须要在pom中引入redisClient的包ui
RedisTemplate配置:spa
@Configuration
public class LettuceRedisConfig {
@Bean
@ConfigurationProperties(prefix = "spring.redis.lettuce.pool")
@Scope(value = "prototype")
public GenericObjectPoolConfig redisPool(){
return new GenericObjectPoolConfig();
}
@Bean
@ConfigurationProperties(prefix = "spring.redis.redis-a")
public RedisStandaloneConfiguration redisConfigA(){
return new RedisStandaloneConfiguration();
}
@Bean
@ConfigurationProperties(prefix = "spring.redis.redis-b")
public RedisStandaloneConfiguration redisConfigB(){
return new RedisStandaloneConfiguration();
}
@Bean
@ConfigurationProperties(prefix = "spring.redis.redis-c")
public RedisStandaloneConfiguration redisConfigC(){
return new RedisStandaloneConfiguration();
}
@Bean
@Primary
public LettuceConnectionFactory factoryA(){
GenericObjectPoolConfig config = config();
LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder()
.poolConfig(config).commandTimeout(Duration.ofMillis(config.getMaxWaitMillis())).build();
return new LettuceConnectionFactory(redisConfigA(), clientConfiguration);
}
@Bean
public LettuceConnectionFactory factoryB(){
GenericObjectPoolConfig config = config();
LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder()
.poolConfig(config).commandTimeout(Duration.ofMillis(config.getMaxWaitMillis())).build();
return new LettuceConnectionFactory(redisConfigB(), clientConfiguration);
}
@Bean
public LettuceConnectionFactory factoryC(){
GenericObjectPoolConfig config = config();
LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder()
.poolConfig(config).commandTimeout(Duration.ofMillis(config.getMaxWaitMillis())).build();
return new LettuceConnectionFactory(redisConfigC(), clientConfiguration);
}
@Bean
public StringRedisTemplate redisTemplateA(){
StringRedisTemplate template = getRedisTemplate();
template.setConnectionFactory(factoryA());
return template;
}
@Bean
public StringRedisTemplate redisTemplateB(){
StringRedisTemplate template = getRedisTemplate();
template.setConnectionFactory(factoryB());
return template;
}
@Bean
public StringRedisTemplate redisTemplateC(){
StringRedisTemplate template = getRedisTemplate();
template.setConnectionFactory(factoryC());
return template;
}
private StringRedisTemplate getRedisTemplate(){
StringRedisTemplate template = new StringRedisTemplate();
template.setValueSerializer(new GenericFastJsonRedisSerializer());
template.setValueSerializer(new StringRedisSerializer());
return template;
}
}
本文只是抛砖引玉,但愿你们给出修改意见
原网址: 访问
创建于: 2021-08-30 15:25:37
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
最新评论