叮咚,Redis OM对象映射框架来了!

一、Redis OM来了

11月23日,redis宣布了四个新的Redis高级客户端的预览版,将这些库称为Redis OM(Redis Object Mapping)-----对象映射。
其框架以强大的 Spring Data Redis (SDR) 框架为基础,提供一个高级抽象工具箱,通过我们熟悉的面向对象的编程来表示。
其目的是专注于对象映射和流畅查询,即尽可能轻松的使用 Redis 。它可以透明地将域对象保存在 Redis 中,并且能使用流畅的、以语言为中心的 API 查询它们。
Redis OM 的一些高级功能依赖于来自两个可用 Redis 模块的核心功能:RediSearch和RedisJSON。

如下,推出了对 .NET、Node.js、Python 和 Java (Spring) 语言的支持

  1. Redis OM for .NET
  2. Redis OM for Node.js
  3. Redis OM for Python
  4. Redis OM for Spring

SSM框架增删改redis报错 redis orm 框架_Redis

二、了解

以下是Redis OM for Spring为例通过查看源码提供的demo:rds-documents模块模拟来更近一步的了解Redis OM

官方包下载:redis-om-spring-main
开发环境:JDK11
springboot版本:2.6.0-M1

:Redis OM的抽象构建在spring-data-redis (SDR)之上

代码解析

1、对象映射

通过注解
@Document 将 Spring Data 对象映射到 Redis JSON
@Indexable 声明式搜索
@Searchable 全文检索索引
@RequiredArgsConstructor(staticName = "of") 表示通过方法of()来构建对象
@NonNull不能为空
补充:@Bloom 以非常快的速度确定一个值是否在集合中

/**
 * 地点
 */
@Data
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Document
public class Address {

    @Id
    private String id;

    @NonNull
    @Searchable
    private String addressName;

    @Indexed
    private Set<String> addressTags = new HashSet<String>();

    @NonNull
    private String picUrl;

    @NonNull
    @Indexed
    private Point location;

    @NonNull
    @Indexed
    private Integer yearRegister;

    private boolean publiclyListed;
}

2、对象的持久化

通过拓展接口RedisDocumentRepository来进行CRUD操作,类似JPA方式的自定义查询。

其通过继承spring data里的接口:PagingAndSortingRepository

/**
 * 通过继承RedisDocumentRepository来进行CRUD操作以及类似JPA方式的自定义查询
 */
public interface AddressRepository extends RedisDocumentRepository<Address, String> {

    // find one by property 通过addressName查询
    Optional<Address> findOneByAddressName(String name);

    // find by tag field, using JRediSearch "native" annotation
    @Query("@tags:{$tags}")
    Iterable<Address> findByTags(@Param("tags") Set<String> tags);

}

查询定义

  • 通过直接从方法名称派生查询。
  • 通过使用@Query或@Aggregation注释使用手动定义的查询。

3、与spring的集成及使用

通过注解@EnableRedisDocumentRepositories扫描指定包下带有@Document注释的对象,注入RedisDocumentRepository,可用CRUD操作自定义查询@Document注释的Bean

/**
 * 启动入口
 */
@SpringBootApplication
@Configuration
@com.redis.om.spring.annotations.EnableRedisDocumentRepositories(basePackages = "com.redis.documents.*")
public class RdsDocumentsApplication {
  public static void main(String[] args) {
    SpringApplication.run(RdsDocumentsApplication.class, args);
  }
     ...
}

4、保存数据

@Autowired
  private AddressRepository addressRepository;

  @Bean
  CommandLineRunner loadTestData() {
    return args -> {
      //删除数据
      addressRepository.deleteAll();
      //save保存数据
      addressRepository.save(Address.of("广州市唯品会地址", "https://www.vip.com/?wq=1", new Point(113.124500, 23.640160), 2000));
      addressRepository.save(Address.of("广州市百度地址", "https://www.baidu.com/", new Point(113.235614, 23.342545), 2020));
    };
  }

5、接口调用

@RestController
@RequestMapping("/api/address")
public class AddressController {

    @Autowired
    private AddressRepository addressRepository;

    @GetMapping("name/{name}")
    Optional<Address> byAddressName(@PathVariable("name") String name) {
        return addressRepository.findOneByAddressName(name);//方法名称派生查询
    }

    @GetMapping("tags")
    Iterable<Address> byTags(@RequestParam("tags") Set<String> tags) {
        return addressRepository.findByTags(tags);//方法名称派生查询
    }

    @GetMapping("all")
    Page<Address> all(Pageable pageable) {
        return addressRepository.findAll(pageable);//spring data自带
    }

    @GetMapping("{id}")
    Optional<Address> byId(@PathVariable("id") String id) {
        return addressRepository.findById(id);//spring data自带
    }
}

6、Maven依赖

<dependency>
  <groupId>com.redis.om.spring</groupId>
  <artifactId>redis-om-spring</artifactId>
  <version>${version}</version>
</dependency>

参考文档

官方介绍:https://redis.com/blog/introducing-redis-om-client-libraries/
git源码:https://github.com/redis/redis-om-spring

总结

Redis OM发布预览版后,引来各程序员们广泛的关注,大家称其为Redis界的Hibernate
有人说,Springboot Redis已经很简洁,此对象映射也是相当于一个Map,新开发一个框架,也是多此一举。
也有人说,能让redis的使用更加简易,更加的符合语言的规范,正所谓语言的优美,其重要的一部分在于它的规范性,是一个很好的进步。

官方解释,
目前redis客户端确实已经支持 Redis各种各样的工具,包括缓存、分布式锁、消息队列等
而此新框架的生成在于并非每个人都有时间自己重新封装这些工具。不是每个人都有时间来将 Redis 哈希映射到 Java 类(反之亦然)。通过构建Redis OM,这样即使大家没有时间使用 Redis 提供的核心数据结构编写自己的抽象,也可以获得 Redis 的性能。

我的想法是,每个框架的生成,都是一个思想的汇总表示,可以给我们的开发提供更多的技术选择。
而技术的进步,也正是因为这些可爱的程序员们在不断拓展和精益求精。

让我们一起期待正式版的发布,期待它更完整的功能!

作者:yana