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有没有拼写错误,这个很容易踩坑
快速排查小步骤
- 先用
redis-cli测试下连通性,命令如下:
如果连不上,优先排查防火墙、密码和SSL的问题redis-cli -h your-redis-name.redis.cache.windows.net -p 6380 -a your-access-key --ssl - 看看应用日志里的异常根因,这个连接池异常的
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.properties或application.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
三、最后给你几个修复异常的小建议
- 一定要用Azure Redis的6380端口(SSL专用端口),6379非SSL端口Azure默认是禁用的
- 调整连接池参数,避免因连接耗尽导致拿不到资源
- 再核对一遍Azure Redis的防火墙规则,确保应用服务器IP能访问
- 检查下
spring-boot-starter-data-redis和Jedis的版本兼容性,版本不匹配也可能出奇怪的问题
内容的提问来源于stack exchange,提问作者AJN




