Spring Data Redis中Repository的findBy方法无法正常工作
解决spring-data-redis 2.7.5按字段查询返回空数组的问题
针对你遇到的findByAppType返回空数组(数据库存在匹配数据),且添加@Indexed无效的情况,按以下步骤排查解决:
1. 确保@Indexed注解正确使用并重建索引
- 必须将
@Indexed标注在appType字段上:@Data @AllArgsConstructor @NoArgsConstructor @RedisHash("Applications") public class Applications implements Serializable { private String appName; @Indexed // 标注在需要索引的字段上 private String appType; @Id private String appId; } - 注意:添加@Indexed前已存在的Redis数据不会自动生成索引,需要重新插入这些数据,或调用
applicationRepository.save(现有实体)触发索引创建。
2. 检查Redis中的索引结构
用Redis客户端执行以下命令验证索引是否存在:
- 查看指定实体的完整数据:
HGETALL Applications:你的appId,确认数据中appType值正确 - 查看对应appType的索引集合:
SMEMBERS Applications:appType:目标类型值,如果返回空,说明索引未生成,需要重新触发索引创建
3. 确认Redis Repository的扫描配置
在Spring Boot主启动类上添加@EnableRedisRepositories,指定Repository所在包路径,确保Repository被正确加载:
@SpringBootApplication @EnableRedisRepositories(basePackages = "com.yourproject.repository") // 替换为你的Repository包路径 public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
4. 检查自定义RedisTemplate的序列化配置
如果自定义了RedisTemplate,需保证序列化方式与spring-data-redis默认逻辑兼容:
- 默认使用
Jackson2JsonRedisSerializer处理实体序列化,若改用其他序列化(如StringRedisSerializer),会导致索引键的格式不匹配,进而查询不到数据。 - 若必须自定义,需同步配置
RedisMappingContext来保证索引生成的正确性。
5. 开启日志调试查询过程
在application.yml中添加日志配置,查看实际执行的Redis命令:
logging: level: org.springframework.data.redis: DEBUG
启动服务后调用接口,查看日志中的SMEMBERS命令对应的key是否与Redis中实际的索引key一致,以此定位索引键不匹配的问题。
内容的提问来源于stack exchange,提问作者Biljana
相关产品推荐
相关产品推荐

