dot Redis 8 发布了——而且是开源的

了解更多

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 Repositories

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 库系列最流行的功能是声明式 Data Repositories。 接下来的两个注解让您可以使用 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 的一个预览版本。 还有很多需要构建,但现在我们需要您的帮助! 您可以查看 README 以获取有关如何在您的 Spring 应用程序中安装该项目的详细信息。 我们欢迎您的反馈、PR 和问题!