<p>Spring Boot 2.x 切换 Jedis 需三步:排除 lettuce-core 依赖、引入 jedis 依赖、显式配置 JedisConnectionFactory Bean;同时 application.yml 中连接池配置须用 spring.redis.jedis.pool.* 前缀,且参数名如 time-between-eviction-runs-millis 不可省略 -millis 后缀。</p>

Spring Boot 2.x 起默认用 Lettuce,想切回 Jedis 不是改个配置就行,必须显式排除默认依赖、引入 jedis、并重写连接工厂 —— 否则 RedisTemplate 仍会走 Lettuce 实现,甚至启动报 Cannot get Jedis connection。
排除 lettuce-core 并引入 jedis 依赖
Spring Boot 的 spring-boot-starter-data-redis 默认带 io.lettuce:lettuce-core,不手动排除就会冲突。Maven 必须做两件事:
- 在
spring-boot-starter-data-redis中用<exclusions>去掉lettuce-core - 单独添加
redis.clients:jedis(建议用4.4.3或更高,兼容 Spring Boot 3.x;若用 2.x,3.9.0是较稳版本)
示例 pom.xml 片段:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.4.3</version>
</dependency>
application.yml 中的连接池参数名完全不同
Jedis 和 Lettuce 的连接池配置项前缀不同,且部分参数语义不一致 —— 直接复用原有 spring.redis.lettuce.pool.* 配置会导致被忽略。
- Jedis 使用
spring.redis.jedis.pool.*(Spring Boot 2.3+ 支持,旧版需靠 Java Config) - 关键参数映射:
max-active→max-active(同名但含义一致),max-wait→max-wait,但min-idle/max-idle在 Jedis 中对应JedisPoolConfig的原生字段,YAML 中写法一样 - 注意:
time-between-eviction-runs在 Jedis 中叫time-between-eviction-runs-millis,少写-millis后缀会静默失效
正确 YAML 示例:
spring:
redis:
host: 127.0.0.1
port: 6379
password:
timeout: 5000
jedis:
pool:
max-active: 20
max-idle: 10
min-idle: 2
max-wait: 2000
time-between-eviction-runs-millis: 30000
必须重写 RedisConnectionFactory 才能生效
仅改依赖和 YAML 不够。Spring Boot 自动配置会尝试创建 LettuceConnectionFactory,而它找不到 lettuce-core 就会失败或 fallback 到空实现。你得提供一个 @Bean 显式返回 JedisConnectionFactory。
- 构造时传入
JedisPoolConfig(可从 YAML 自动绑定,也可手写)和RedisStandaloneConfiguration - 别漏掉
setUsePooling(true),否则即使配了 pool 参数也走单连接 - 如果用了密码或 database,必须在
RedisStandaloneConfiguration中设置,不能只靠 YAML 的spring.redis.password
精简 Java Config 示例:
@Configuration
public class RedisConfig {
@Bean
public JedisConnectionFactory jedisConnectionFactory(RedisProperties properties) {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName(properties.getHost());
config.setPort(properties.getPort());
config.setPassword(RedisPassword.of(properties.getPassword()));
config.setDatabase(properties.getDatabase());
JedisClientConfiguration.JedisClientConfigurationBuilder builder =
JedisClientConfiguration.builder();
builder.usePooling();
builder.poolConfig(jedisPoolConfig(properties.getJedis().getPool()));
return new JedisConnectionFactory(config, builder.build());
}
private JedisPoolConfig jedisPoolConfig(RedisProperties.Pool pool) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(pool.getMaxActive());
config.setMaxIdle(pool.getMaxIdle());
config.setMinIdle(pool.getMinIdle());
config.setMaxWaitMillis(pool.getMaxWait().toMillis());
config.setTimeBetweenEvictionRunsMillis(
pool.getTimeBetweenEvictionRuns().toMillis());
return config;
}
}
最常被跳过的点:没重写 JedisConnectionFactory Bean,或 YAML 里写了 lettuce.pool 却以为它对 Jedis 也起作用 —— 这两类错误都会导致运行时连接异常或连接池参数完全不生效。


















