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()); } }