使用Jedis连接池导致Redis连接无限增长问题

1. Redis Server 配置检查 : redis.cnf ,确定 Redis配置无问题

  • timeout :配置连接空闲1800秒(半小时)后释放
  • tcp-keepalive : ack心跳,60秒检测连接是否还存在,存在则继续连接,如果不存在就释放。

2. Jedis连接池配置(Jedis依赖3.9.0)

  • MAX_ACTIVE : 64
  • MAX_IDEL : 16
  • MIN_IDEL : 8

3. 测试用例

Jmeter 500线程,get/set/hget/hset 基本使用,持续一周

4. 测试结果

Jedis 连接池配置 : maxTotal 64, 服务配置最大连接数1w,结果增长到 7k,马上溢出

  • 检查客户端连接情况 info clients

        

  •  检查测试Java进程端口情况 netstat -nap | grep 3360(进程号) | grep .174:6379

  • 检查进程链接详情

  • Java进程Debug输出情况

输出代码:

jedisShardedPool.getNumActive()
jedisShardedPool.getNumIdle()
jedisShardedPool.getNumWaiters()

5. 结论

持续排查问题点,确定连接持续增长的原因

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当多个线程频繁地使用Redis时,使用连接可以提高应用程序的性能。下面是使用连接集成Redis的步骤: 1. 在pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.10.0</version> </dependency> ``` 2. 创建Redis连接配置类。以下是一个示例: ```java @Configuration public class RedisPoolConfig { @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.maxIdle}") private int maxIdle; @Value("${spring.redis.maxTotal}") private int maxTotal; @Value("${spring.redis.maxWaitMillis}") private long maxWaitMillis; @Bean public JedisPool jedisPool() { JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxIdle(maxIdle); poolConfig.setMaxTotal(maxTotal); poolConfig.setMaxWaitMillis(maxWaitMillis); JedisPool jedisPool = new JedisPool(poolConfig, host, port, timeout, password); return jedisPool; } } ``` 在上面的代码中,我们使用JedisPoolConfig来配置我们的连接,并创建一个JedisPool bean。您可以根据实际情况调整连接的最大空闲连接数,最大连接数和最长等待时间。 3. 在您的服务类或控制器类中使用Redis连接。您可以使用@Autowired注解注入JedisPool bean,然后使用它来获取Jedis实例并执行Redis操作。以下是一个示例: ```java @Autowired private JedisPool jedisPool; public void setValue(String key, String value) { try (Jedis jedis = jedisPool.getResource()) { jedis.set(key, value); } } public String getValue(String key) { try (Jedis jedis = jedisPool.getResource()) { return jedis.get(key); } } ``` 在上面的代码中,我们使用了try-with-resources语句来确保在使用Jedis实例后关闭连接。这可以确保连接中的连接得到正确释放。 这就是使用连接集成Redis的步骤。希望这可以帮助您提高您的应用程序性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值