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

x33g5p2x  于2021-11-30 转载在 Redis  
字(4.2k)|赞(0)|评价(0)|浏览(829)

叮咚,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

二、了解

以下是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 以非常快的速度确定一个值是否在集合中

  1. /** * 地点 */
  2. @Data
  3. @RequiredArgsConstructor(staticName = "of")
  4. @AllArgsConstructor(access = AccessLevel.PROTECTED)
  5. @Document
  6. public class Address {
  7. @Id
  8. private String id;
  9. @NonNull
  10. @Searchable
  11. private String addressName;
  12. @Indexed
  13. private Set<String> addressTags = new HashSet<String>();
  14. @NonNull
  15. private String picUrl;
  16. @NonNull
  17. @Indexed
  18. private Point location;
  19. @NonNull
  20. @Indexed
  21. private Integer yearRegister;
  22. private boolean publiclyListed;
  23. }

2、对象的持久化

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

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

  1. /** * 通过继承RedisDocumentRepository来进行CRUD操作以及类似JPA方式的自定义查询 */
  2. public interface AddressRepository extends RedisDocumentRepository<Address, String> {
  3. // find one by property 通过addressName查询
  4. Optional<Address> findOneByAddressName(String name);
  5. // find by tag field, using JRediSearch "native" annotation
  6. @Query("@tags:{$tags}")
  7. Iterable<Address> findByTags(@Param("tags") Set<String> tags);
  8. }

查询定义

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

3、与spring的集成及使用

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

  1. /** * 启动入口 */
  2. @SpringBootApplication
  3. @Configuration
  4. @com.redis.om.spring.annotations.EnableRedisDocumentRepositories(basePackages = "com.redis.documents.*")
  5. public class RdsDocumentsApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(RdsDocumentsApplication.class, args);
  8. }
  9. ...
  10. }

4、保存数据

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

5、接口调用

  1. @RestController
  2. @RequestMapping("/api/address")
  3. public class AddressController {
  4. @Autowired
  5. private AddressRepository addressRepository;
  6. @GetMapping("name/{name}")
  7. Optional<Address> byAddressName(@PathVariable("name") String name) {
  8. return addressRepository.findOneByAddressName(name);//方法名称派生查询
  9. }
  10. @GetMapping("tags")
  11. Iterable<Address> byTags(@RequestParam("tags") Set<String> tags) {
  12. return addressRepository.findByTags(tags);//方法名称派生查询
  13. }
  14. @GetMapping("all")
  15. Page<Address> all(Pageable pageable) {
  16. return addressRepository.findAll(pageable);//spring data自带
  17. }
  18. @GetMapping("{id}")
  19. Optional<Address> byId(@PathVariable("id") String id) {
  20. return addressRepository.findById(id);//spring data自带
  21. }
  22. }

6、Maven依赖

  1. <dependency>
  2. <groupId>com.redis.om.spring</groupId>
  3. <artifactId>redis-om-spring</artifactId>
  4. <version>${version}</version>
  5. </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 的性能。

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

由于之前在公司分享了redis的基础与进阶,打算补充完最后一节Redis相关的分布式锁,然而看到Redis OM的预览版,更让我充满期待,故分享出来。

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

作者:yana

相关文章

最新文章

更多