redis.clients.jedis.exceptions.JedisDataException: ERR Syntax error, try CLIENT (LIST | KILL ip:port
目录
1.报错分析
这个报错问题主要先看你的application.properties文件当中的配置redis是否正确,我的是这样的,
# Redis服务器配置
spring.data.redis.host=127.0.0.1
spring.data.redis.port=6379
spring.data.redis.password=111111(没有设置密码就不要这段就行)
# Redis连接池配置
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.data.redis.timeout=30000
如果你的Redis连接池配置在application.properties
文件中应该是正确的。但是,由于您仍然遇到了Redis连接问题,可能还有其他原因导致了这个错误。
2.检查redis是否连接
首先,确保Redis服务器正常运行并且可以从您的应用程序所在的主机访问。您可以使用以下命令来测试Redis服务器是否正常运行。
使用命令:
redis-cli ping
如果Redis服务器没有运行,请确保启动它。
接下来,请检查应用程序代码,特别是与Redis相关的部分,确保没有发送不正确的Redis命令。确保使用的Redis客户端库版本与您的应用程序和Redis服务器兼容。
3.使用Lettuce
如果问题仍然存在,您可以尝试切换到使用Lettuce作为Redis客户端,因为它是Spring Boot 2.x 默认支持的Redis客户端。以下是如何在pom.xml
中添加Lettuce依赖的示例:
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</dependency>
您可以将Redis连接工厂配置修改为适用于Lettuce的方式:
RedisConfig.java
import java.time.Duration;
/**
* Redis 配置类
*/
@Configuration
@EnableCaching
public class RedisConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory();
lettuceConnectionFactory.setHostName("127.0.0.1");
lettuceConnectionFactory.setPort(6379);
lettuceConnectionFactory.setPassword("111111");
System.out.println("Redis 连接工厂:" + lettuceConnectionFactory.toString());
return lettuceConnectionFactory;
}
将使用Lettuce作为Redis客户端,并且不再依赖于Jedis。在切换到Lettuce后,再次运行您的应用程序,看看是否仍然遇到相同的问题.
完整的RedisConfig配置
package com.tscabinet.config;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.serializer.*;
import redis.clients.jedis.JedisPoolConfig;
import java.time.Duration;
/**
* Redis 配置类
*/
@Configuration
@EnableCaching
public class RedisConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory();
lettuceConnectionFactory.setHostName("127.0.0.1");
lettuceConnectionFactory.setPort(6379);
lettuceConnectionFactory.setPassword("111111");
System.out.println("Redis 连接工厂:" + lettuceConnectionFactory.toString());
return lettuceConnectionFactory;
}
/**
* 配置缓存管理器
* @param factory Redis 线程安全连接工厂
* @return 缓存管理器
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
// 生成两套默认配置,通过 Config 对象即可对缓存进行自定义配置
RedisCacheConfiguration cacheConfig1 = RedisCacheConfiguration.defaultCacheConfig()
// 设置过期时间 10 分钟
.entryTtl(Duration.ofMinutes(10))
// 设置缓存前缀
.computePrefixWith(cacheName -> "cache:user:" + cacheName + ":")
// 禁止缓存 null 值
.disableCachingNullValues()
// 设置 key 序列化
.serializeKeysWith(keyPair())
// 设置 value 序列化
.serializeValuesWith(valuePair());
RedisCacheConfiguration cacheConfig2 = RedisCacheConfiguration.defaultCacheConfig()
// 设置过期时间 30 秒
.entryTtl(Duration.ofSeconds(30))
.computePrefixWith(cacheName -> "cache:admin:" + cacheName + ":")
.disableCachingNullValues()
.serializeKeysWith(keyPair())
.serializeValuesWith(valuePair());
RedisCacheConfiguration cacheConfig3 = RedisCacheConfiguration.defaultCacheConfig()
// 设置过期时间 30 秒
.entryTtl(Duration.ZERO)
.computePrefixWith(cacheName -> "cache:NoTime:" + cacheName + ":")
.disableCachingNullValues()
.serializeKeysWith(keyPair())
.serializeValuesWith(valuePair());
// 返回 Redis 缓存管理器
return RedisCacheManager.builder(factory)
.withCacheConfiguration("user", cacheConfig1)
.withCacheConfiguration("admin", cacheConfig2)
.withCacheConfiguration("NoTime", cacheConfig3)
.build();
}
/**
* 配置键序列化
* @return StringRedisSerializer
*/
private RedisSerializationContext.SerializationPair<String> keyPair() {
return RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer());
}
/**
* 配置值序列化,使用 GenericJackson2JsonRedisSerializer 替换默认序列化
* @return GenericJackson2JsonRedisSerializer
*/
private RedisSerializationContext.SerializationPair<Object> valuePair() {
return RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer());
}
}