Spring Boot 3 默认不支持 Redis OM,需显式引入 redis-om-spring 并排除 RedisAutoConfiguration、RedisCacheConfiguration 和 LettuceConnectionConfiguration,否则因序列化冲突、Bean 冲突或 RediSearch 模块缺失导致启动失败。

Spring Boot 3 默认不支持 Redis OM,必须显式引入 redis-om-spring 并禁用 Spring Data Redis 的默认自动配置,否则会因序列化冲突或 Bean 冲突直接启动失败。
为什么不能直接用 spring-boot-starter-data-redis 配合 Redis OM?
Redis OM 是 Redis 官方推出的对象映射框架(类似 JPA 对 MySQL),它依赖自己的连接工厂(RedisOMClient)、注解(@Document、@Id)和查询机制(RediSearch),与 Spring Data Redis 的 RedisTemplate / StringRedisTemplate 完全不兼容:
-
RedisTemplate默认使用 JDK 或 Jackson 序列化,而 Redis OM 要求数据以 JSON 格式存入,且 key 必须带命名空间前缀(如user:123) - 两者都尝试注册
RedisConnectionFactory类型的 Bean,Spring Boot 3 的严格依赖检查会报NoUniqueBeanDefinitionException - 若保留
@EnableCaching或自定义RedisCacheManager,Redis OM 的索引扫描和聚合查询会静默失效
必须排除的自动配置类
在 @SpringBootApplication 上添加 exclude 参数,彻底切断 Spring Data Redis 的干扰:
@SpringBootApplication(exclude = {
RedisAutoConfiguration.class,
RedisCacheConfiguration.class,
LettuceConnectionConfiguration.class
})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
注意:JedisConnectionConfiguration 可不加,因为 Spring Boot 3 默认已不启用 Jedis;但 LettuceConnectionConfiguration 必须排除——否则它仍会创建 RedisConnectionFactory,导致 Redis OM 初始化时抛出 IllegalStateException: RedisConnectionFactory already initialized。
实体类必须用 @Document + @Id + @Indexed
Redis OM 不识别 JPA 注解,也不接受 Lombok 的 @Data 自动生成 getter/setter(除非开启 lombok.anyConstructor.addConstructorProperties=true):
-
@Document表示该类将被持久化到 Redis,并启用 RediSearch 索引 -
@Id字段必须是String类型,不能是Long或自增 ID;值为空时,Redis OM 会自动生成 UUID -
@Indexed才能被RediSearchRepository查询到;普通字段(如name)不加该注解,就无法用findByXXX方法检索
示例:
@Document
public class User {
@Id
private String id;
@Indexed
private String name;
@Indexed
private Integer age;
// 必须提供无参构造函数
public User() {}
// getter/setter 省略
repository 接口要继承 RedisDocumentRepository
不能继承 JpaRepository 或 CrudRepository,必须用 Redis OM 提供的接口:
public interface UserRepository extends RedisDocumentRepository<user string> {
List<user> findByName(String name);
List<user> findByAgeGreaterThan(Integer age);
}</user></user></user>
关键点:
- 泛型参数顺序是
,IdType 必须和@Id字段类型一致(即String) - 方法名需符合 Redis OM 的解析规则:
findByName→WHERE name == ?;findByAgeGreaterThan→WHERE age > ? - 不支持
@Query自定义语句(v0.9.x 尚未实现),所有查询都基于 RediSearch 的 FT.SEARCH 命令生成
最后,在 Service 中注入 UserRepository 即可使用,无需手动调用 save() 或处理序列化 —— Redis OM 会自动将对象转为 JSON 存入 user:{id},并同步建立 RediSearch 索引。
最容易被忽略的是:Redis OM 要求 Redis 服务必须启用 RediSearch 模块(6.2+ 内置,旧版需 redis-server --loadmodule /path/to/redisearch.so),否则 FT.CREATE 命令会返回 unknown command 错误,且不会在日志中明确提示模块缺失。











