SpringBoot配置Redis链接池

本文详细介绍了如何在Spring Boot应用中配置Redis连接池,包括读取和绑定配置参数到JedisProperties类,以及创建RedisClientBean进行常用Redis操作的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先是redis各个参数的配置,在 application-dev.properties中配置如下:

#redis配置
redis.server.host=192.168.50.162
redis.server.port=6379
redis.server.password=password
redis.server.timeOut=5000
redis.server.maxIdle=50
redis.server.maxWaitMillis=5000
redis.server.maxTotal=500

对 redis 配置参数进行读取和绑定,配置属性注入到 JedisProperties:

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = JedisProperties.JEDIS_PREFIX)
public class JedisProperties {

	public static final String JEDIS_PREFIX = "redis.server";

	private String host;

	private int port;

	private String password;

	private int maxTotal;

	private int maxIdle;

	private int maxWaitMillis;

	private int timeOut;

	public int getTimeOut() {
		return timeOut;
	}

	public void setTimeOut(int timeOut) {
		this.timeOut = timeOut;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getHost() {
		return host;
	}

	public void setHost(String host) {
		this.host = host;
	}

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}

	public int getMaxTotal() {
		return maxTotal;
	}

	public void setMaxTotal(int maxTotal) {
		this.maxTotal = maxTotal;
	}

	public int getMaxIdle() {
		return maxIdle;
	}

	public void setMaxIdle(int maxIdle) {
		this.maxIdle = maxIdle;
	}

	public int getMaxWaitMillis() {
		return maxWaitMillis;
	}

	public void setMaxWaitMillis(int maxWaitMillis) {
		this.maxWaitMillis = maxWaitMillis;
	}

}

配置了 Redis 连接池之后,将 Redis 连接池 注入到 RedisClient 中,并生成 RedisClient Bean:

import com.mljr.auth.config.properties.JedisProperties;
import com.mljr.auth.util.RedisClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

@Configuration
@EnableConfigurationProperties(JedisProperties.class)
@ConditionalOnClass(RedisClient.class)
public class JedisConfig {

	private Logger logger = LoggerFactory.getLogger(JedisConfig.class);

	@Autowired
	private JedisProperties prop;

	@Bean(name = "jedisPool")
	public JedisPool jedisPool() {
		JedisPoolConfig config = new JedisPoolConfig();
		config.setMaxTotal(prop.getMaxTotal());
		config.setMaxIdle(prop.getMaxIdle());
		config.setMaxWaitMillis(prop.getMaxWaitMillis());
		return new JedisPool(config, prop.getHost(), prop.getPort(), prop.getTimeOut(), prop.getPassword());
	}

	@Bean
	@ConditionalOnMissingBean(RedisClient.class)
	public RedisClient redisClient(@Qualifier("jedisPool") JedisPool pool) {
		logger.info("初始化……Redis Client==Host={},Port={}", prop.getHost(), prop.getPort());
		RedisClient redisClient = new RedisClient();
		redisClient.setJedisPool(pool);
		return redisClient;
	}

}

配置一些常用的 redis 的操作:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class RedisClient {

	private JedisPool jedisPool;

	public void set(String key, Object value) {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			jedis.set(key, value.toString());
		}catch (Exception e){
			e.printStackTrace();
		}finally {
			jedis.close();
		}
	}

	/**
	 * 设置过期时间 
	 * @param key
	 * @param value
	 * @param exptime
	 * @throws Exception
	 */
	public void setWithExpireTime(String key, String value, int exptime) {
		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			jedis.set(key, value, "NX", "EX", 300);
		} catch (Exception e){
			e.printStackTrace();
		}finally {
			jedis.close();
		}
	}

	public String get(String key) {

		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			return jedis.get(key);
		} catch (Exception e){
			e.printStackTrace();
		}finally {
			if (jedis != null)
			jedis.close();
		}
		return null;
	}
	public JedisPool getJedisPool() {
		return jedisPool;
	}

	public void setJedisPool(JedisPool jedisPool) {
		this.jedisPool = jedisPool;
	}

}

 

<< Spring Boot 中使用 Redis 连接池通常是基于 `lettuce` 或者 `jedis` 客户端实现的,默认情况下 Spring Boot 使用的是 Lettuce(从 2.x 版本开始)。Redis 连接池的主要目的是为了管理与 Redis 的连接,避免每次请求都创建和销毁新的连接,从而提升性能并减少资源消耗。 ### 如何配置 Redis 连接池? #### 方法一:直接通过 `application.properties` 配置文件 ```properties # Redis服务器地址 spring.redis.host=localhost # Redis服务器端口 spring.redis.port=6379 # 设置最大空闲连接数 spring.redis.lettuce.pool.max-idle=5 # 设置最小空闲连接数 spring.redis.lettuce.pool.min-idle=0 # 设置最大连接数 spring.redis.lettuce.pool.max-active=8 # 最大等待时间 spring.redis.lettuce.pool.max-wait=-1ms ``` 以上配置项中: - **max-idle**:控制池中的空闲连接的最大数量。 - **min-idle**:控制池中的最低空闲连接的数量。 - **max-active**:设置同时活动连接的最大数目。 - **max-wait**:当池用完时,连接获取的最大等待时间。如果为 `-1ms` 表示无限期等待。 如果你仍然想使用 Jedis,则可以将依赖替换为 jedis,并调整相应的属性名称到 `spring.redis.jedis.*` 命名空间下。 #### 方法二:自定义配置类 你可以手动定制更复杂的 Redis 池参数,比如以下是一个基于 Java Config 的例子: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import io.lettuce.core.ClientOptions; @Configuration public class RedisConfig { @Bean public LettuceConnectionFactory redisConnectionFactory() { // 配置 Redis 单机模式 (也可以修改为集群模式) RedisStandaloneConfiguration standaloneConf = new RedisStandaloneConfiguration("localhost", 6379); // 自定义 lettuce pool 参数 LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder() .clientOptions(ClientOptions.builder().disconnectedBehavior(ClientOptions.DisconnectedBehavior.REJECT_COMMANDS).build()) .build(); return new LettuceConnectionFactory(standaloneConf, clientConfig); } } ``` 此外还可以引入 Apache Commons Pool 来进一步增强对连接池的支持: ```xml <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> ``` 然后可以通过 `GenericObjectPoolConfig` 对其进行详细配置: ```java @Bean public GenericObjectPoolConfig<?> genericObjectPoolConfig(){ var config = new GenericObjectPoolConfig<>(); config.setMaxTotal(10); // 总共可用连接数限制为 10 config.setMinIdle(5); // 至少保持 5个闲置链接不被回收 return config; } ``` 最后将其注入到 Redis 配置工厂即可生效. --- ### 解释: 1. 在分布式系统架构设计里,缓存服务是非常重要的一环,而 Redis 是最流行的内存数据库之一; 2. 访问频率高的业务场景通常会对后端存储带来压力,这时就需要借助像 Redis 这样的中间件来缓解; 3. 同样由于频繁访问造成过多线程阻塞、上下文切换等问题也需要合理利用连接池技术去优化性能表现; 因此正确地配置Redis 连接池对于保证应用稳定性和提高吞吐量至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值