dot 快速未来的趋势正在您的城市举办的活动中出现。

加入我们在 Redis 发布会上

介绍 Redis OM Spring

Redis 和 Spring 的对象映射等

Redis OM Spring 是一个新的客户端库,旨在帮助您在 Spring 应用程序中对域进行建模并将数据持久化到 Redis。该库与开源 Redis 一起使用,但在与 RedisJSON 一起使用时提供了许多额外的索引和查询功能。

Redis 与其模块相结合,构成了地球上最快的数据库平台之一。但利用它的速度并不总是那么容易。Redis OM Spring 提供了引人注目的开发人员体验,在这篇文章中,我将向您展示可以使用它构建什么。

动机

作为一名开发人员,很少会偶然发现既强大又简单的技术。仅凭 OSS Redis,您就可以拥有大量数据结构和关联命令来执行企业应用程序所需的许多面向数据和消息的任务。

同样,在企业 Java 开发领域,Spring 在过去 18 年中已经控制了构建大型功能丰富的应用程序的复杂性。在这个领域,Redis 受到了出色的 Spring Data Redis 的支持,它提供了与 OSS Redis 交互的低级和高级抽象。

使用 Spring Data Redis 的挑战之一是它不支持 Redis 模块。在 Redis,我们开发了 几个具有变革意义的 Redis 模块,这些模块使用搜索、JSON 索引和查询、图数据、时间序列数据以及用于服务器端计算的完整框架(Redis Gears)来丰富 Redis 核心数据结构。我们构建了 Redis OM Spring 来利用这些模块并提供更广泛的功能。

Redis OM Spring

Redis OM 客户端库系列旨在为您的语言/平台提供符合习惯的高级抽象。我们目前服务于 Node.js、Python、.NET 和 Spring 社区。Redis OM Spring 使开发人员能够轻松地将 Redis 的强大功能添加到他们的 Spring Boot 应用程序中。

具体而言,Redis OM Spring 提供了基于出色的 Spring Data Redis (SDR) 框架构建的强大的存储库和自定义对象映射抽象。

当前的预览版提供了所有 Spring Data Redis 功能,以及

  • Java 到 JSON 映射
  • 增强的散列映射
  • 自动搜索索引生成
  • 由 RediSearch 支持的 Spring Data 存储库

Java 到 JSON 映射

要使用 RedisJSON 将 Java 对象映射到存储在 Redis 中的 JSON 文档,您可以使用 @Document 注解。与任何其他 Spring Data 实体映射注解一样,您将其添加到类声明中。例如,假设您想映射类型为 Company 的对象。只需添加 @Document,如下所示

package com.yourcompany.domain;

@Document
public class Company {
  @Id private String id;
  @Searchable private String name;
  @Indexed private Point location;
  @Indexed private Set<String> tags = new HashSet<String>();
  @Indexed private Integer numberOfEmployees;
  @Indexed private Integer yearFounded;
  private String url;
  private boolean publiclyListed;

  // ...
}

您可能会注意到,此类的主体有几个注解。@Id 来自 Spring Data,它将 id 属性声明为将存储我们 JSON 文档的 Redis 密钥。

可以说,Spring Data 库系列中最受欢迎的功能是声明式数据存储库。接下来的两个注解使您可以使用 RediSearch 来索引 JSON 文档。这通过 RedisDocumentRepository 接口公开

package com.yourcompany.repositories;

import com.yourcompany.domain.Company;
import com.redis.om.spring.repository.RedisDocumentRepository;

public interface CompanyRepository extends RedisDocumentRepository<Company, String> {
}

空存储库声明是您获得 POJO 的基本 CRUD 功能/分页和排序所需的一切。

Redis OM Spring 使用用 @Indexed@Searchable 注解的 POJO 字段来构建索引模式。对于 Company POJO,我们有一个名为“searchable”的名称属性,这意味着我们获得了对该字段的全文搜索功能。这体现在模式字段定义 $.name AS name TEXT 中。

另一方面,字段标签被注解为“indexable”,这意味着我们获得了类型为 TAG 的索引字段,这意味着我们可以通过字段的精确值来搜索公司。这同样体现在模式字段定义中:$.tags[*] AS tags TAG

创建简单的动态查询

也许 Redis OM Spring 最引人注目的功能是它能够在运行时从存储库接口自动创建存储库实现。通过对适当的字段进行索引,您现在可以完成以下所有查询,而无需编写任何其他代码

package com.yourcompany.repositories;

import java.util.*;

import org.springframework.data.geo.Distance;
import org.springframework.data.geo.Point;
import org.springframework.data.repository.query.Param;

import com.yourcompany.domain.Company;
import com.redis.om.spring.annotations.Query;
import com.redis.om.spring.repository.RedisDocumentRepository;

public interface CompanyRepository extends RedisDocumentRepository<Company, String> {
  // find one by property
  Optional<Company> findOneByName(String name);

  // geospatial query
  Iterable<Company> findByLocationNear(Point point, Distance distance);

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

  // find by numeric property
  Iterable<Company> findByNumberOfEmployees(int noe);

  // find by numeric property range
  Iterable<Company> findByNumberOfEmployeesBetween(int noeGT, int noeLT);

  // starting with/ending with
  Iterable<Company> findByNameStartingWith(String prefix);
}

存储库代理有两种方法可以从方法名称派生特定于存储的查询

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

让我们检查添加到存储库接口中的几个方法声明。

findOneByName

Redis OM Spring 使用方法名称和参数来生成适当的查询。它使用方法返回类型来确定如何打包和返回结果。

findOneByName 返回一个 Optional of CompanyfindOne 还意味着即使有多个结果,也只会返回一个结果。该库会解析方法名称以确定预期参数的数量。例如,方法的 ByName 部分告诉我们我们期望一个名为 name 的参数。

findByLocationNear

Redis OM Spring 支持 GeoJSON 类型来存储地理空间数据。通过在我们的查询中使用 near 关键字,我们告诉我们的代码期望 Point (org.springframework.data.geo.Point)Distance (org.springframework.data.geo.Distance) 类型作为参数。

使用存储库

与其他 Spring Data 存储库一样,您可以将存储库注入到另一个 Spring 组件中

@RestController
@RequestMapping("/api/companies")
public class CompanyController {
  @Autowired
  CompanyRepository repository;

  @GetMapping("name/{name}")
  Optional<Company> byName(@PathVariable("name") String name) {
    return repository.findOneByName(name);
  }
}

总结

这仅仅是 Redis OM Spring预览版本。还有很多东西要构建,但现在我们需要您的帮助!您可以查看 自述文件,了解如何在 Spring 应用程序中安装项目。我们欢迎您提供反馈意见、PR 和问题!