You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring整合Azure Redis缓存遇JedisConnectionException及SSL配置问题

解决Spring集成Azure Redis缓存的JedisConnectionException异常及SSL配置方法

嘿,我来帮你分析并解决这个Spring集成Azure Redis时遇到的问题!下面分两部分来说:先排查JedisConnectionException: Could not get a resource from the pool的异常原因,再告诉你怎么在JedisConnectionFactory里配置SSL属性。

一、先搞懂为什么会出现这个连接池异常

这个异常本质是Redis连接池拿不到可用连接,结合Azure Redis的特性,常见原因有这些:

  • 网络/防火墙限制:Azure Redis默认只允许白名单里的IP访问,先去Azure Portal看看你的应用服务器IP是不是在Redis实例的防火墙允许列表里
  • 未开启SSL连接:Azure Redis强制要求用SSL(默认端口6380),如果没配置SSL,连接会被直接拒绝,时间久了连接池就耗空了
  • 连接池参数配置不合理:比如最大连接数设得太小,或者超时时间太短,导致连接不够用或者频繁断开
  • Redis实例状态异常:去Azure Portal检查下你的Redis实例是不是正常运行,内存使用率有没有飙到上限
  • 凭证错误:确认下Redis的access key有没有拼写错误,这个很容易踩坑

快速排查小步骤

  1. 先用redis-cli测试下连通性,命令如下:
    redis-cli -h your-redis-name.redis.cache.windows.net -p 6380 -a your-access-key --ssl
    
    如果连不上,优先排查防火墙、密码和SSL的问题
  2. 看看应用日志里的异常根因,这个连接池异常的cause字段通常会告诉你具体是连接超时、认证失败还是别的问题

二、给JedisConnectionFactory配置SSL的两种方法

Azure Redis必须用SSL连接,所以这一步是关键,下面两种配置方式任你选:

1. Java配置类方式(推荐自定义场景)

在你的CacheConfig类里手动创建JedisConnectionFactory,并开启SSL:

import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import redis.clients.jedis.JedisPoolConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cache.annotation.EnableCaching;

@Configuration
@EnableCaching
public class CacheConfig {

    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.port}")
    private int redisPort;

    @Value("${spring.redis.password}")
    private String redisPassword;

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        // 先配置连接池参数,根据自己的业务调整
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(100); // 最大连接数
        poolConfig.setMaxIdle(20);   // 最大空闲连接数
        poolConfig.setMinIdle(5);    // 最小空闲连接数

        JedisConnectionFactory jedisConnFactory = new JedisConnectionFactory(poolConfig);
        jedisConnFactory.setHostName(redisHost);
        jedisConnFactory.setPort(redisPort);
        jedisConnFactory.setPassword(redisPassword);
        // 重点!开启SSL
        jedisConnFactory.setUseSsl(true);
        // 注:生产环境不建议跳过证书验证,如果有特殊需求可以自定义SslSocketFactory
        // jedisConnFactory.setSslSocketFactory(...);
        jedisConnFactory.afterPropertiesSet();
        return jedisConnFactory;
    }

    // 这里可以继续配置RedisTemplate、CacheManager等组件...
}

2. 配置文件方式(Spring Boot自动配置场景)

如果用Spring Boot的自动配置,直接在application.propertiesapplication.yml里加配置就行:

application.properties版本

spring.redis.host=your-redis-name.redis.cache.windows.net
spring.redis.port=6380
spring.redis.password=your-access-key
# 开启SSL
spring.redis.ssl=true
# 连接池参数按需调整
spring.redis.jedis.pool.max-active=100
spring.redis.jedis.pool.max-idle=20
spring.redis.jedis.pool.min-idle=5

application.yml版本

spring:
  redis:
    host: your-redis-name.redis.cache.windows.net
    port: 6380
    password: your-access-key
    ssl: true
    jedis:
      pool:
        max-active: 100
        max-idle: 20
        min-idle: 5

三、最后给你几个修复异常的小建议

  1. 一定要用Azure Redis的6380端口(SSL专用端口),6379非SSL端口Azure默认是禁用的
  2. 调整连接池参数,避免因连接耗尽导致拿不到资源
  3. 再核对一遍Azure Redis的防火墙规则,确保应用服务器IP能访问
  4. 检查下spring-boot-starter-data-redis和Jedis的版本兼容性,版本不匹配也可能出奇怪的问题

内容的提问来源于stack exchange,提问作者AJN

火山引擎 最新活动