使用redisTemplate高并发下连接池满的问题

用JMeter进行高并发测试的时候,发现报错:

org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; 
nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool

连不上redis,是因为连接池不够用了
我用的是redisTemplate来操作redis,而redisTemplate并不会自动释放连接
有一个方法,就是加大最大连接数,但是治标不治本,加到redis.maxIdle=1000了,看似够大了,但连接数一直在增加,迟早会崩

找了很久,最后发现 这个方法可用

在使用redisTemplate的部分用try-catch-finally包起来
在catch-finally中加上,手动断开连接,现在就不会报错了

RedisConnectionUtils.unbindConnection(redisTemplate.getConnectionFactory());

现在设置最大连接数redis.maxIdle=100也没事了
在redis-cli中输入 info clients 现在的连接数大概在二三十左右

参考:
https://blog.csdn.net/yulio1234/article/details/76417688

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下步骤使用nacos动态修改springboot下的RedisTemplate连接池配置: 1. 在pom.xml文件中添加nacos-spring-boot-starter和spring-boot-starter-actuator依赖。 2. 在application.properties文件中配置nacos相关信息,如下所示: ``` spring.cloud.nacos.config.server-addr=localhost:8848 spring.cloud.nacos.config.namespace=your-namespace spring.cloud.nacos.config.group=your-group spring.cloud.nacos.config.prefix=your-prefix ``` 3. 在RedisConfig.java文件中定义RedisTemplate,并使用@RefreshScope注解标记该类,如下所示: ``` @Configuration @RefreshScope public class RedisConfig { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private int port; @Value("${spring.redis.password}") private String password; @Value("${spring.redis.timeout}") private int timeout; @Value("${spring.redis.jedis.pool.max-active}") private int maxActive; @Value("${spring.redis.jedis.pool.max-wait}") private long maxWait; @Value("${spring.redis.jedis.pool.max-idle}") private int maxIdle; @Value("${spring.redis.jedis.pool.min-idle}") private int minIdle; @Bean public JedisPoolConfig jedisPoolConfig() { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxTotal(maxActive); jedisPoolConfig.setMaxWaitMillis(maxWait); jedisPoolConfig.setMaxIdle(maxIdle); jedisPoolConfig.setMinIdle(minIdle); return jedisPoolConfig; } @Bean public RedisConnectionFactory redisConnectionFactory() { RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(); redisStandaloneConfiguration.setHostName(host); redisStandaloneConfiguration.setPort(port); redisStandaloneConfiguration.setPassword(RedisPassword.of(password)); JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jedisPoolingClientConfigurationBuilder = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder(); jedisPoolingClientConfigurationBuilder.poolConfig(jedisPoolConfig()); JedisClientConfiguration jedisClientConfiguration = jedisPoolingClientConfigurationBuilder.build(); return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration); } @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory()); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); return redisTemplate; } } ``` 在上述代码中,我们使用@Value注解从配置文件中获取Redis连接池相关的参数,然后使用JedisPoolConfig和JedisClientConfiguration配置连接池,并使用RedisTemplate配置Redis连接工厂和RedisTemplate。 4. 在nacos配置中心添加配置信息,如下所示: ``` spring.redis.jedis.pool.max-active=500 spring.redis.jedis.pool.max-wait=5000 spring.redis.jedis.pool.max-idle=10 spring.redis.jedis.pool.min-idle=2 ``` 在上述配置中,我们只修改了Redis连接池的相关参数。 5. 在需要动态修改Redis连接池配置的地方,使用@Value注解注入Redis连接池相关参数,如下所示: ``` @Value("${spring.redis.jedis.pool.max-active}") private int maxActive; @Value("${spring.redis.jedis.pool.max-wait}") private long maxWait; @Value("${spring.redis.jedis.pool.max-idle}") private int maxIdle; @Value("${spring.redis.jedis.pool.min-idle}") private int minIdle; ``` 6. 使用Spring Cloud Bus和Spring Cloud Config实现配置的动态刷新,如下所示: - 在pom.xml文件中添加spring-cloud-starter-bus-amqp和spring-cloud-starter-config依赖。 - 在application.properties文件中添加如下配置: ``` spring.cloud.bus.enabled=true spring.cloud.bus.trace.enabled=true spring.cloud.config.server.rabbitmq.enabled=true spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest ``` - 在RedisConfig.java文件中使用@RefreshScope注解标记该类。 - 在需要动态刷新配置的地方,使用@Value注解注入配置参数。 - 使用POST请求发送/bus/refresh接口,可以实现配置的动态刷新。 以上就是使用nacos动态修改springboot下的RedisTemplate连接池配置的全部步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值