原理
直接通过配置注入多个RedisTemplate,需要用到哪个库时直接使用对应的RedisTemplate即可。
第一步:创建项目指定Maven依赖:
org.projectlombok
lombok
1.18.10
com.fasterxml.jackson.core
jackson-core
2.10.1
com.fasterxml.jackson.core
jackson-databind
2.10.1
com.fasterxml.jackson.core
jackson-annotations
2.10.1
com.fasterxml.jackson.datatype
jackson-datatype-jsr310
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.springframework.boot
spring-boot-starter-data-redis
org.apache.commons
commons-pool2
第二步:application.yml
redis:
database:
db1: 5
db2: 7
host: 127.0.0.1
port: 6379
password: 123456
timeout: 1000
pool:
max-active: 100
max-idle: 3
min-idle: 0
max-wait: -1
第三步:Redis配置文件
@Configuration
public class RedisConfig {
@Value("${redis.database.db1}")
private int db1;
@Value("${redis.database.db2}")
private int db2;
@Value("${redis.host}")
private String host;
@Value("${redis.port}")
private int port;
@Value("${redis.password}")
private String password;
@Value("${redis.timeout}")
private int timeout;
@Value("${redis.pool.max-active}")
private int maxActive;
@Value("${redis.pool.max-idle}")
private int maxIdle;
@Value("${redis.pool.min-idle}")
private int minIdle;
@Value("${redis.pool.max-wait}")
private int maxWait;
@Bean
public GenericObjectPoolConfig getPoolConfig(){
// 配置redis连接池
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxTotal(maxActive);
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMinIdle(minIdle);
poolConfig.setMaxWaitMillis(maxWait);
return poolConfig;
}
@Bean(name = "redisTemplate1")
public StringRedisTemplate getRedisTemplate1(){
return getStringRedisTemplate(db1);
}
@Bean(name = "redisTemplate2")
public StringRedisTemplate getRedisTemplate2(){
// 构建工厂对象
return getStringRedisTemplate(db2);
}
private StringRedisTemplate getStringRedisTemplate(int database) {
// 构建工厂对象
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName(host);
config.setPort(port);
//config.setPassword(RedisPassword.of(password));
LettucePoolingClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
.commandTimeout(Duration.ofSeconds(timeout))
.poolConfig(getPoolConfig())
.build();
LettuceConnectionFactory factory = new LettuceConnectionFactory(config, clientConfig);
// 设置使用的redis数据库
factory.setDatabase(database);
// 重新初始化工厂
factory.afterPropertiesSet();
return new StringRedisTemplate(factory);
}
}
第四步:测试代码
@SpringBootTest
public class DemoTest {
@Resource(name = "redisTemplate1")
private StringRedisTemplate redisTemplate1;
@Resource(name = "redisTemplate2")
private StringRedisTemplate redisTemplate2;
@Test
public void fun1() {
// 向redis中存值
redisTemplate1.opsForValue().set("name", "zhangsan");
redisTemplate2.opsForValue().set("name", "lisi");
}
@Test
public void fun2() {
// 向redis中存值同时指定过期时间
redisTemplate1.opsForValue().set("name", "zhangsan");
redisTemplate1.expire("name",3, TimeUnit.MINUTES);
redisTemplate2.opsForValue().set("name", "lisi");
redisTemplate2.expire("name",3, TimeUnit.MINUTES);
}
}