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 缓存。
- Redis 发布/订阅消息 与 Redis Stream 监听器。
- 用于 Java 的 Redis 集合实现,例如
RedisList或RedisSet。
为何使用 Spring Data Redis?
Spring Framework 是领先的全栈 Java/JEE 应用框架。它提供了一个轻量级容器,以及通过依赖注入、AOP 和可移植服务抽象所实现的非侵入式编程模型。
NoSQL 存储系统为实现水平可扩展性和速度提供了一种不同于经典 RDBMS 的替代方案。从实现角度来看,键值存储是 NoSQL 领域中规模最大(也是历史最悠久)的成员之一。
Spring Data Redis(SDR)框架通过消除与存储交互所需的冗余任务和样板代码,并借助 Spring 优秀的基础设施支持,让你可以轻松编写使用 Redis 键值存储的 Spring 应用。
Redis 支持高层视图 {#redis:architecture}
Redis 支持提供了若干组件。对于大多数任务,高层抽象和支持服务是最佳选择。请注意,在任何时候你都可以在各层之间切换。例如,你可以获取一个低层连接(甚至原生库)来直接与 Redis 通信。
章节总结
入门
搭建可用环境的一个简单方式是通过 start.spring.io 创建一个基于 Spring 的项目,或在 Spring Tools 中创建一个 Spring 项目。
驱动
使用 Redis 和 Spring 时的首要任务之一是通过 IoC 容器连接到存储。为此,需要一个 Java 连接器(或绑定库)。无论你选择哪个库,都只需使用同一套 Spring Data Redis API(它在所有连接器之间行为一致),即 org.springframework.data.redis.connection 包及其 RedisConnection 和 RedisConnectionFactory 接口,用于处理和获取到 Redis 的活动连接。
连接模式
Redis 可以在多种部署形态下运行。每种运行模式都需要特定的配置,后续章节会逐一说明。
RedisTemplate
大多数用户很可能会使用 RedisTemplate 及其对应的包 org.springframework.data.redis.core,或其响应式变体 ReactiveRedisTemplate。事实上,由于其丰富的功能集,该模板是 Redis 模块的核心类。模板为 Redis 交互提供了高层抽象。虽然 [Reactive]RedisConnection 提供接受并返回二进制值(字节数组)的低层方法,但模板负责序列化和连接管理,使用户免于处理这些细节。
Redis 缓存
Spring Data Redis 在 org.springframework.data.redis.cache 包中提供了 Spring Framework 缓存抽象的一个实现。要把 Redis 用作后端实现,请按如下方式把 RedisCacheManager 添加到你的配置中:
Redis 集群
使用 Redis Cluster 需要 Redis Server 3.0 或更高版本。更多信息请参见 Cluster Tutorial。
哈希映射
可以使用 Redis 中的各种数据结构来存储数据。JacksonJsonRedisSerializer 可以把对象转换为 JSON 格式。理想情况下,JSON 可以用普通 key 作为值存储。通过使用 Redis 哈希,你可以实现对结构化对象更精细的映射。Spring Data Redis 提供了多种把数据映射到哈希的策略(取决于用例):
订阅/发布 消息
3 个项目
Redis Streams
Redis Streams 以一种抽象的方式对日志数据结构建模。日志通常是只追加(append-only)的数据结构,可以从头开始消费、从某个随机位置消费,或者通过流式方式消费新消息。
脚本
Redis 2.6 及更高版本支持通过 eval 和 evalsha 命令运行 Lua 脚本。Spring Data Redis 为运行脚本提供了高层抽象,它处理序列化并自动使用 Redis 脚本缓存。
Redis 事务
Redis 通过 multi、exec 和 discard 命令提供事务支持。这些操作在 RedisTemplate 上可用。但是,不保证 RedisTemplate 使用同一个连接运行事务中的所有操作。
流水线操作
Redis 支持流水线操作,即向服务器发送多条命令而不等待回复,然后在单个步骤中读取这些回复。当你需要连续发送多条命令时(例如向同一个 List 添加许多元素),流水线操作可以提高性能。
支持类
org.springframework.data.redis.support 包提供了多种可复用组件,它们以 Redis 作为后端存储。目前该包在 Redis 之上包含各种基于 JDK 接口的实现,例如原子计数器和 JDK 集合。