优先选org.springframework.boot:spring-boot-starter-data-redis;spring boot项目自动装配连接池、序列化器和模板类,省80%配置;纯java项目才用redis.clients:jedis并配commons-pool2。

用 Maven 引入 redis.clients:jedis 还是 org.springframework.boot:spring-boot-starter-data-redis?
看项目是否已用 Spring Boot。纯 Java 项目或想直接操作底层协议,选 jedis;Spring Boot 项目优先用 spring-boot-starter-data-redis——它自动装配连接池、序列化器和模板类,省掉 80% 手动配置。
常见错误:混用两者却没排除默认依赖。比如 Spring Boot 2.0+ 默认用 Lettuce,若强行引入 jedis 又不 exclude lettuce-core,启动时会报 ClassNotFoundException: io.lettuce.core.RedisClient 或连接复用异常。
- Spring Boot 项目加依赖时显式排除 Lettuce:
<exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> - 纯 Java 项目别只引
jedis,还得配commons-pool2(JedisPool依赖它管理连接) -
jedis是同步阻塞客户端,高并发下需调大maxTotal和maxWaitMillis,否则常抛JedisConnectionException: Could not get a resource from the pool
JedisPool 初始化时哪些参数不能瞎设?
连接池参数直接影响 Redis 命令超时和线程阻塞行为。最常踩的坑是把 maxWaitMillis 设为 -1(无限等待),线上突发流量时大量线程卡在 pool.getResource(),拖垮整个应用。
-
maxTotal建议设为 Redis 实例最大连接数的 70%~80%,例如 Redismaxclients=10000,这里设 7000 即可 -
maxIdle和minIdle别设太高,否则空闲连接占内存又不释放;生产环境minIdle=5、maxIdle=50足够 -
testOnBorrow设为true会导致每次取连接都发PING,QPS 高时延迟明显;改用testWhileIdle=true+timeBetweenEvictionRunsMillis=30000更稳妥 - 务必设置
blockWhenExhausted=false或至少设合理maxWaitMillis(如 2000),避免线程永久挂起
Spring Boot 中 RedisTemplate 序列化乱码或存不进数据?
默认 RedisTemplate 用 JdkSerializationRedisSerializer,存的是二进制字节流,Redis CLI 里看到的就是乱码;更严重的是,如果 key 或 value 含中文、特殊字符,且没配对的序列化器,opsForValue().set("user:name", "张三") 可能写入失败或读出来是 null。
立即学习“Java免费学习笔记(深入)”;
- 业务系统一律改用
StringRedisTemplate操作字符串,或给RedisTemplate显式指定StringRedisSerializer:
template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new StringRedisSerializer());
GenericJackson2JsonRedisSerializer,但注意:对象字段得有 getter/setter,且类要加 @Data 或手动实现 Serializable
StringRedisTemplate 的默认序列化器已改为 StringRedisSerializer,但自定义 RedisTemplate 仍需手动配,这点容易漏连不上 Redis 报 Cannot assign requested address 或 Connection refused?
不是代码问题,是网络或配置层堵住了。本地开发时最典型:Docker 里跑 Redis,Java 应用在宿主机,却填了 localhost:6379——这会让 Java 去连宿主机的 6379,而不是容器的。
- Docker 场景统一用
host.docker.internal:6379(Mac/Windows)或宿主机 IP(Linux) - 检查 Redis 是否监听
0.0.0.0:6379,而非127.0.0.1:6379(看redis.conf中bind行) - 防火墙或云服务器安全组必须放行 6379 端口;阿里云 ECS 默认关闭所有入方向端口
- Spring Boot 配置项写错位置:
spring.redis.host和spring.redis.port必须在application.yml的顶层,不能缩进到其他节点下,否则静默失效











