SpringBoot 2.7.5集成Redis无法存数据且无报错,求技术支持
SpringBoot 2.7.5集成Redis无法存储键值对排查方案
以下是针对该问题的具体排查步骤:
1. 确认Redis服务状态
- 执行命令
redis-cli ping,若返回PONG则Redis服务正常;若超时或无响应,检查Redis是否启动、端口6379是否被占用、本地防火墙是否拦截Redis端口。 - 用
redis-cli登录后执行keys *,确认Redis本身是否能正常存储键值对,排除服务端异常。
2. 检查依赖配置
- 当前同时引入
spring-boot-starter-data-redis和jedis,但该starter默认使用lettuce作为客户端,手动引入jedis可能导致版本冲突,建议修改依赖:<!-- 排除默认的lettuce,引入jedis --> <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> </dependency> - 排查项目中是否存在其他缓存依赖(如ehcache),这类依赖可能覆盖Redis缓存配置,导致实际未使用Redis作为缓存介质。
3. 验证配置类正确性
- 确认配置类添加了
@Configuration注解,且RedisTemplate/StringRedisTemplate的Bean方法添加了@Bean注解,确保被Spring容器正确管理。 - 若自定义了序列化配置,检查是否存在序列化失败的情况(比如对象未实现Serializable接口,或Jackson序列化配置错误),这类问题可能无显性异常但无法存储数据。
- 优先使用
StringRedisTemplate测试,它默认使用字符串序列化,可避免因序列化规则导致的隐形问题。
4. 测试代码有效性
- 编写简单的单元测试直接操作Redis,排除业务代码的干扰:
@SpringBootTest public class RedisTest { @Autowired private StringRedisTemplate stringRedisTemplate; @Test public void testRedisOperation() { // 存储键值对 stringRedisTemplate.opsForValue().set("test_key", "test_value"); // 获取值并打印 String value = stringRedisTemplate.opsForValue().get("test_key"); System.out.println("Redis存储的值:" + value); } } - 若使用Spring Cache注解(如
@Cacheable),需确认:- 启动类添加了
@EnableCaching注解; - 被缓存的方法是被Spring代理的(不能在同一个类内部调用);
- 缓存的键生成规则是否符合预期,避免键名异常导致无法查询到数据。
- 启动类添加了
5. 补充配置细节与日志排查
- 检查配置文件是否遗漏必要项:若Redis设置了密码,需添加
spring.redis.password;若使用非默认数据库,添加spring.redis.database(默认值为0)。 - 开启Redis相关DEBUG日志,查看隐藏的异常信息:
通过日志确认Redis连接是否成功、操作是否被执行、是否有序列化或连接相关的隐性异常。logging.level.org.springframework.data.redis=DEBUG logging.level.redis.clients.jedis=DEBUG
内容的提问来源于stack exchange,提问作者sam98
相关产品推荐
相关产品推荐

