在spring boot连接redis中,默认连接的是0号库,但是在业务中,为了便于区分管理,需要连接多个库
- pom.xml
<!--redis 配置-->
<!--redis默认使用的Lettuce客户端-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
<!--使用默认的Lettuce时,若配置spring.redis.lettuce.pool则必须配置该依赖-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
- application.yml中
redis:
host: localhost
port: 6379
database:
db0: 0
db1: 1
db2: 2
timeout: 6000 # 连接超时时长(毫秒)
pool:
max-active: 100 # 连接池最大连接数(使用负值表示没有限制)
max-idle: 3 # 连接池中的最大空闲连接
min-idle: 0 # 连接池中的最小空闲连接
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
- 封装的配置
package com.qianhe.utlis.RedisDB;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.time.Duration;
@Configuration
public class RedisConfig {
@Value("${redis.database.db0}")
private int db0;
@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;
}
@Primary
@Bean(name = "redisTemplate0")
public StringRedisTemplate getRedisTemplate0(){
return getStringRedisTemplate(db0);
}
@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);
}
}
- 使用:
package com.qianhe.war.controller;
import com.qianhe.utlis.response.RetInfo;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
@Controller
public class RedisTest {
@Resource(name = "redisTemplate2")
private RedisTemplate<String, String> redisTemplate2;
@GetMapping("/redis")
@ResponseBody
public RetInfo userInfo(){
redisTemplate2.opsForValue().set("k11111","2",3600, TimeUnit.SECONDS);
return RetInfo.success();
}
}
- 查看结果