Redis
Spring Data 支持的键值存储之一是 Redis。引用 Redis 项目主页的话:
Redis 是一个高级的键值存储系统。它与 memcached 类似,但数据集是非易失性的,并且值可以是字符串(与 memcached 完全相同),也可以是列表、集合和有序集合。所有这些数据类型都可以通过原子操作来操作,例如推送/弹出元素、添加/删除元素、在服务器端执行集合的并集、交集、差集等操作。Redis 支持多种排序功能。
Spring Data Redis 为 Spring 应用程序提供了简便的配置和访问 Redis 的方式。它提供了低级别和高级别的抽象,用于与存储进行交互,从而让用户无需关注基础设施问题。
Spring Data 对 Redis 的支持包含了广泛的功能:
-
RedisTemplate 和 ReactiveRedisTemplate 辅助类,在执行常见的 Redis 操作时提高生产力。包括对象和值之间的集成序列化。
-
将异常转换为 Spring 的可移植数据访问异常层次结构。
-
自动实现Repository 接口,包括对自定义查询方法的支持。
-
功能丰富的对象映射,与 Spring 的 Conversion Service 集成。
-
基于注解的映射元数据,可扩展以支持其他元数据格式。
-
通过 Spring 的 Cache 抽象集成Redis 缓存。
-
针对 Java 的Redis 集合实现,例如
RedisList
或RedisSet
。
为什么选择 Spring Data Redis?
Spring 框架是领先的全栈 Java/JEE 应用程序框架。它提供了一个轻量级的容器,并通过使用依赖注入、AOP 和可移植的服务抽象来实现非侵入式的编程模型。
NoSQL 存储系统为水平扩展和速度提供了传统关系型数据库管理系统(RDBMS)的替代方案。在实现方面,键值存储是 NoSQL 领域中最庞大(也是最古老)的成员之一。
Spring Data Redis(SDR)框架通过消除与 Redis 键值存储交互所需的冗余任务和样板代码,使得编写使用 Redis 的 Spring 应用程序变得非常简单。这一切都得益于 Spring 优秀的基础设施支持。
Redis 支持的高层视角 {#redis:architecture}
Redis 支持提供了多个组件。对于大多数任务,高级抽象和支持服务是最佳选择。请注意,您可以在任何时候在各个层次之间切换。例如,您可以获取一个低级连接(甚至是原生库)来直接与 Redis 进行通信。
章节摘要
📄️ 入门指南
一个简单的方法来引导设置工作环境是通过 start.spring.io 创建一个基于 Spring 的项目,或者在 Spring Tools 中创建一个 Spring 项目。
📄️ 驱动程序
在使用 Redis 和 Spring 时,首要任务之一是通过 IoC 容器连接到存储。为此,需要一个 Java 连接器(或绑定)。无论选择哪个库,你只需要使用一套 Spring Data Redis API(这些 API 在所有连接器中的行为是一致的)。org.springframework.data.redis.connection 包及其 RedisConnection 和 RedisConnectionFactory 接口用于处理和获取到 Redis 的活动连接。
📄️ 连接模式
Redis 可以在多种设置下运行。每种操作模式都需要特定的配置,以下各节将对此进行详细说明。
📄️ 通过 RedisTemplate 操作对象
大多数用户可能会使用 RedisTemplate 及其对应的包 org.springframework.data.redis.core,或者它的响应式变体 ReactiveRedisTemplate。事实上,由于 RedisTemplate 功能丰富,它是 Redis 模块的核心类。RedisTemplate 为 Redis 交互提供了高级抽象。虽然 \[Reactive]RedisConnection 提供了接受和返回二进制值(字节数组)的低级方法,但 RedisTemplate 负责序列化和连接管理,使用户无需处理这些细节。
📄️ Redis 缓存
Spring Data Redis 在 org.springframework.data.redis.cache 包中提供了 Spring Framework 缓存抽象的实现。要将 Redis 作为后端实现,请将 RedisCacheManager 添加到您的配置中,如下所示:
📄️ Redis 集群
使用 Redis 集群需要 Redis 服务器版本 3.0 以上。更多信息请参阅集群教程。
📄️ 哈希映射
在 Redis 中,可以使用多种数据结构来存储数据。Jackson2JsonRedisSerializer 可以将对象转换为 JSON 格式。理想情况下,JSON 可以作为值通过普通的键来存储。通过使用 Redis 哈希,你可以实现更复杂的结构化对象映射。Spring Data Redis 提供了多种将数据映射到哈希的策略(根据具体的使用场景):
📄️ 发布/订阅消息传递
Spring Data 提供了专门的 Redis 消息传递集成,其功能和命名与 Spring Framework 中的 JMS 集成类似。
📄️ Redis 流
Redis Streams 以一种抽象的方式模拟了日志数据结构。通常情况下,日志是仅追加(append-only)的数据结构,可以从开头、随机位置或通过流式传输新消息来消费。
📄️ 脚本编写
Redis 2.6 及更高版本提供了通过 eval 和 evalsha 命令运行 Lua 脚本的支持。Spring Data Redis 为运行脚本提供了一个高级抽象,它处理序列化,并自动使用 Redis 脚本缓存。
📄️ Redis 事务
Redis 通过 multi、exec 和 discard 命令提供了对事务的支持。这些操作在 RedisTemplate 中也是可用的。然而,RedisTemplate 并不能保证事务中的所有操作都在同一个连接中执行。
📄️ 流水线
Redis 提供了对管道(pipelining)的支持,管道允许在不等待服务器回复的情况下一次性发送多个命令,然后在一个步骤中读取所有回复。当你需要连续发送多个命令时(例如向同一个 List 中添加多个元素),管道可以显著提升性能。
📄️ 支持类
包 org.springframework.data.redis.support 提供了各种可重用的组件,这些组件依赖 Redis 作为后端存储。目前,该包包含基于 JDK 接口的各种实现,这些实现构建在 Redis 之上,例如原子计数器与 JDK 集合等。