Redis 仓库
本章将介绍 Spring Data 存储库的基本基础以及 Redis 的具体内容。在继续探讨 Redis 的具体内容之前,请确保您对这些基本概念有充分的理解。
Spring Data 仓库抽象的目标是显著减少实现各种持久化存储数据访问层所需的样板代码量。
使用 Redis 存储库可以让你无缝地将领域对象转换并存储到 Redis 哈希中,应用自定义的映射策略,并使用二级索引。
Redis 仓库要求至少 Redis 服务器版本为 2.8.0,并且不支持事务处理。请确保使用一个禁用事务支持的 RedisTemplate
。
章节摘要
📄️ 核心概念
Spring Data 仓库抽象中的核心接口是 Repository。它接受要管理的领域类以及领域类的标识符类型作为类型参数。这个接口主要作为一个标记接口,用于捕获要处理的类型,并帮助您发现扩展了该接口的接口。
📄️ 定义仓库接口
要定义一个仓库接口,首先需要定义一个特定于领域类的仓库接口。该接口必须扩展 Repository,并且要指定领域类和 ID 类型。如果你想为该领域类型暴露 CRUD 方法,可以扩展 CrudRepository 或其变体,而不是 Repository。
📄️ 定义查询方法
仓库代理有两种方式从方法名派生出特定于存储的查询:
📄️ 创建存储库实例
本节介绍如何为已定义的仓库接口创建实例和 bean 定义。
📄️ 用法
Spring Data Redis 让您可以轻松实现领域实体,如下例所示:
📄️ 对象映射基础
本节涵盖了 Spring Data 对象映射、对象创建、字段和属性访问、可变性和不可变性的基础知识。需要注意的是,本节仅适用于不使用底层数据存储(如 JPA)对象映射的 Spring Data 模块。此外,请务必查阅特定存储的章节,以了解特定存储的对象映射,如索引、自定义列名或字段名等。
📄️ 对象到哈希映射
Redis Repository 支持将对象持久化为哈希。这需要进行对象到哈希的转换,该转换由 RedisConverter 完成。默认实现使用 Converter 将属性值映射到 Redis 原生的 byte\[],以及从 Redis 原生的 byte\[] 映射回属性值。
📄️ Keyspaces
Keyspaces 定义了用于创建 Redis 哈希实际键的前缀。默认情况下,前缀设置为 getClass().getName()。你可以通过在聚合根级别设置 @RedisHash 或通过程序化配置来更改此默认值。然而,注解的 keyspace 会优先于任何其他配置。
📄️ 二级索引
二级索引用于基于原生 Redis 结构启用查找操作。每次保存时,值会被写入相应的索引中,并在对象被删除或过期时被移除。
📄️ 生存时间 (Time To Live)
存储在 Redis 中的对象可能只在特定时间内有效。这对于在 Redis 中持久化短期对象特别有用,因为不需要在它们达到生命周期结束时手动删除它们。可以通过 @RedisHash(timeToLive=…) 来设置以秒为单位的过期时间,也可以通过 KeyspaceConfiguration.KeyspaceSettings 来设置(参见 Keyspaces)。
📄️ Redis 特定的查询方法
查询方法允许从方法名称自动推导出简单的查找查询,如下例所示:
📄️ 示例查询
本章将介绍 Query by Example 并解释如何使用它。
📄️ 在集群上运行的 Redis 仓库
你可以在 Redis 集群环境中使用 Redis 仓库支持。有关 ConnectionFactory 的配置详情,请参阅“Redis 集群”部分。尽管如此,还需要进行一些额外的配置,因为默认的键分布会将实体和二级索引分散到整个集群及其槽中。
📄️ Redis 存储库剖析
Redis 作为一个存储系统本身提供了一个非常狭窄的低级 API,将诸如二级索引和查询操作等更高级别的功能留给用户自行实现。
📄️ 投影
Spring Data 的查询方法通常返回由存储库管理的聚合根的一个或多个实例。然而,有时可能希望基于这些类型的某些属性创建投影。Spring Data 允许建模专门的返回类型,以便更有选择性地检索托管聚合的部分视图。
📄️ 自定义存储库实现
Spring Data 提供了多种选项来创建查询方法,同时只需少量编码。但当这些选项无法满足你的需求时,你也可以为仓库方法提供自定义的实现。本节将介绍如何做到这一点。
📄️ 从聚合根发布事件
由仓库管理的实体是聚合根。在领域驱动设计(Domain-Driven Design, DDD)应用程序中,这些聚合根通常会发布领域事件。Spring Data 提供了一个名为 @DomainEvents 的注解,你可以将其用于聚合根的方法上,以尽可能简化事件的发布,如下例所示:
📄️ 仓库方法的空值处理
自 Spring Data 2.0 起,返回单个聚合实例的仓库 CRUD 方法使用 Java 8 的 Optional 来表示可能缺失的值。除此之外,Spring Data 还支持在查询方法上返回以下包装类型:
📄️ CDI 集成
仓库接口的实例通常由容器创建,当使用 Spring Data 时,Spring 是最自然的选择。Spring 提供了复杂的功能来创建 bean 实例。Spring Data Redis 附带了一个自定义的 CDI 扩展,允许你在 CDI 环境中使用仓库抽象。该扩展是 JAR 文件的一部分,因此,要激活它,只需将 Spring Data Redis JAR 放入你的类路径中。
📄️ 仓库查询关键词
下表列出了 Spring Data 仓库查询派生机制通常支持的主题关键字,用于表达谓词。请查阅特定存储的文档以获取支持的关键字的准确列表,因为此处列出的一些关键字可能在某些特定的存储中不受支持。
📄️ 仓库查询返回类型
下表列出了 Spring Data 仓库通常支持的返回类型。但是,请查阅特定存储的文档以获取支持的返回类型的准确列表,因为此处列出的一些类型可能在特定存储中不受支持。
📄️ Querydsl
Spring Data Redis 不支持 Querydsl。