Spring Data(数据)Redis
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Data(数据)Redis相关的知识,希望对你有一定的参考价值。
版本 3.0.0
Spring Data Redis 项目通过使用键值样式数据存储将核心 Spring 概念应用于解决方案的开发。 我们提供了一个“模板”作为发送和接收消息的高级抽象。 您可能会注意到与 Spring 框架中的 JDBC 支持有相似之处。
本节提供了一个易于遵循的指南,用于开始使用 Spring Data Redis 模块。
1. 学习之春
Spring Data 使用 Spring 框架的核心功能,包括:
- 国际奥委会容器
- 型式转换系统
- 表达式语言
- JMX 集成
- DAO 异常层次结构。
虽然你不需要知道Spring API,但理解它们背后的概念是很重要的。 至少,控制反转 (IoC) 背后的想法应该很熟悉,并且您应该熟悉您选择使用的任何 IoC 容器。
Redis 支持的核心功能可以直接使用,无需调用 Spring 容器的 IoC 服务。 这很像,它可以“独立”使用,而无需 Spring 容器的任何其他服务。 要利用 Spring Data Redis 的所有功能,例如存储库支持,您需要配置库的某些部分以使用 Spring。JdbcTemplate
要了解有关 Spring 的更多信息,您可以参考详细解释 Spring 框架的综合文档。 有很多关于这个主题的文章、博客条目和书籍。 有关更多信息,请参阅 Spring 框架主页。
一般来说,这应该是想要尝试Spring Data Redis的开发人员的起点。
2. 学习 NoSQL 和键值存储
NoSQL存储已经席卷了存储世界。 这是一个广阔的领域,拥有大量的解决方案、术语和模式(更糟糕的是,甚至术语本身也有多重含义)。 虽然有些原则很常见,但您必须在一定程度上熟悉 SDR 支持的商店。熟悉这些解决方案的最佳方法是阅读其文档并遵循其示例。 通常不需要超过五到十分钟来完成它们,如果您来自仅 RDMBS 的背景,很多时候这些练习可能会让人大开眼界。
2.1. 试用示例
人们可以在专用的 Spring 数据示例存储库中找到键值存储的各种示例,https://github.com/spring-projects/spring-data-keyvalue-examples。 对于Spring Data Redis,您应该特别注意样本,这是一个建立在Redis之上的Twitter克隆,可以在本地运行或部署到云中。 有关详细信息,请参阅其文档,以下博客条目。retwisj
3. 要求
Spring Data Redis 二进制文件需要 JDK 级别 17 及更高版本和Spring Framework6.0.0 及更高版本。
在键值存储方面,需要 Redis2.6.x 或更高版本。 Spring Data Redis 目前正在针对最新的 6.0 版本进行测试。
4. 其他帮助资源
学习一个新框架并不总是那么简单。 在本节中,我们尝试提供我们认为易于遵循的指南,以便从 Spring Data Redis 模块开始。 但是,如果您遇到问题或需要建议,请随时使用以下链接之一:
社区论坛
Stack Overflow上的Spring Data是所有Spring Data(不仅仅是文档)用户共享信息和互相帮助的标签。 请注意,只有发布时才需要注册。
专业支持
专业的,从源头支持,保证响应时间,可从Spring Data和Spring背后的公司Pivotal Sofware,Inc.获得。
5. 后续开发
有关 Spring 数据源存储库、夜间构建和快照工件的信息,请参阅 Spring数据主页。
您可以通过在spring-data或spring-data-redis 上与 Stack Overflow 上的开发人员进行交互,帮助 Spring Data 最好地满足 Spring 社区的需求。
如果您遇到错误或想要提出改进建议(包括本文档),请在Github 上创建工单。
要了解Spring生态系统中的最新消息和公告,请订阅Spring社区门户。
最后,您可以在Twitter上关注Spring博客或项目团队(@SpringData)。
6. 依赖关系
由于各个 Spring 数据模块的开始日期不同,因此它们中的大多数都带有不同的主要和次要版本号。找到兼容版本的最简单方法是依靠我们随附的与定义的兼容版本一起提供的春季数据发布列车 BOM。在 Maven 项目中,您将在 POM 的部分中声明此依赖项,如下所示:<dependencyManagement />
例 1.使用弹簧数据发布列车物料清单
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-bom</artifactId>
<version>2022.0.0</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
当前发布训练版本是。火车版本使用带有图案的犊牛。 对于 GA 版本和服务版本,版本名称如下,对于所有其他版本,版本名称如下:,其中可以是以下之一:2022.0.0
YYYY.MINOR.MICRO
$calver
$calver-$modifier
modifier
-
SNAPSHOT
:当前快照 -
M1
,,等等:里程碑M2
-
RC1
,,等等:发布候选版本RC2
您可以在我们的Spring 数据示例存储库中找到使用 BOM 的工作示例。有了这个,你可以声明你想要使用的 Spring 数据模块,而无需在块中有一个版本,如下所示:<dependencies />
例 2.声明对 Spring 数据模块的依赖关系
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
<dependencies>
6.1. 使用 Spring 引导进行依赖管理
Spring Boot 会为你选择最新版本的 Spring 数据模块。如果仍要升级到较新版本,请将 要使用的训练版本和迭代的属性。spring-data-releasetrain.version
6.2. 弹簧框架
Spring 数据模块的当前版本需要 Spring Framework 6.0.0 或更高版本。这些模块还可以使用该次要版本的较旧错误修复版本。但是,强烈建议使用该代中的最新版本。
7. 简介
7.1. 文档结构
参考文档的这一部分解释了Spring Data Redis提供的核心功能。 它解释了键值模块的概念和语义以及各种存储命名空间的语法。 有关键值存储、Spring 或 Spring 数据示例的介绍,请参阅学习 NoSQL 和键值存储。 本文档仅涉及 Spring Data Redis 支持,并假设用户熟悉键值存储和 Spring 概念。
“Redis 支持”引入了 Redis 模块功能集。
“Redis 存储库”介绍了对 Redis 的存储库支持。
本文档是 Spring 数据 Redis (SDR) 支持的参考指南。
8. 升级弹簧数据
有关如何从早期版本的 Spring 数据升级的说明在项目wiki 上提供。 按照发行说明部分中的链接查找要升级到的版本。
升级说明始终是发行说明中的第一项。如果您落后多个版本,请确保您还查看了您跳转的版本的发行说明。
8.1. 接下来要读什么
决定升级应用程序后,可以在文档的其余部分找到有关特定功能的详细信息。 您可以在本文档末尾找到特定于主要版本迁移的迁移指南。
Spring Data 的文档特定于该版本,因此您在此处找到的任何信息都将包含该版本中的最新更改。
9. 为什么选择弹簧数据 Redis?
Spring 框架是领先的全栈 Java/JEE 应用程序框架。它提供了一个轻量级容器和一个通过使用依赖注入、AOP 和可移植服务抽象实现的非侵入式编程模型。
NoSQL存储系统为传统RDBMS提供了水平可扩展性和速度的替代方案。在实现方面,键值存储代表了NoSQL空间中最大(也是最古老的)成员之一。
Spring Data Redis(SDR)框架通过Spring出色的基础架构支持消除了与存储交互所需的冗余任务和样板代码,从而可以轻松编写使用Redis键值存储的Spring应用程序。
10. 红地思支持
Spring Data 支持的键值存储之一是Redis。引用 Redis 项目主页:
Redis 是一个高级键值存储。它类似于 memcached 但数据集不是易失性的,值可以是字符串,就像在 memcached 中一样,也可以是列表、集合和有序集合。所有这些数据类型都可以通过原子操作来推送/弹出元素、添加/删除元素、执行服务器端并集、交集、集合之间的差异等。Redis 支持不同类型的排序功能。
Spring Data Redis 提供了从 Spring 应用程序对 Redis 的简单配置和访问。它提供了用于与商店交互的低级和高级抽象,使用户摆脱了基础设施问题。
10.1. 入门
设置工作环境的一种简单方法是在STS 中创建基于 Spring 的项目。
首先,您需要设置一个正在运行的 Redis 服务器。
要在 STS 中创建 Spring 项目,请执行以下操作:
- 转到→“新建→ Spring 模板项目”→“简单 Spring 实用程序项目”,并在出现提示时按“是”。然后输入项目和包名称,例如。 .将以下内容添加到 pom.xml 文件元素:
org.spring.redis.example
dependencies
<dependencies>
<!-- other dependency elements omitted -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
- 将 pom 中的 Spring 版本.xml更改为
<spring.framework.version>6.0.0</spring.framework.version>
- 将 Maven 的 Spring 里程碑存储库的以下位置添加到您的位置,使其与 yourelement 处于同一级别:
pom.xml
<dependencies/>
<repositories>
<repository>
<id>spring-milestone</id>
<name>Spring Maven MILESTONE Repository</name>
<url>https://repo.spring.io/libs-milestone</url>
</repository>
</repositories>
存储库也可以在此处浏览。
Spring Redis 需要 Redis 2.6 或更高版本,Spring Data Redis 集成了Lettuce和Jedis,这是两个流行的 Redis 开源 Java 库。
10.3. Redis 支持高级视图
Redis 支持提供了多个组件。对于大多数任务,高级抽象和支持服务是最佳选择。请注意,您可以随时在图层之间移动。例如,您可以获得低级连接(甚至本机库)以直接与 Redis 通信。
10.4. 连接到 Redis
使用 Redis 和 Spring 时的首要任务之一是通过 IoC 容器连接到存储。为此,需要 Java 连接器(或绑定)。无论您选择哪个库,您只需要使用一组 Spring Data Redis API(在所有连接器上行为一致):用于处理和检索与 Redis 的活动连接的 package 和 itsand接口。org.springframework.data.redis.connection
RedisConnection
RedisConnectionFactory
10.4.1. 重新连接和重新连接工厂
RedisConnection
为 Redis 通信提供核心构建块,因为它处理与 Redis 后端的通信。它还会自动将底层连接库异常转换为 Spring 一致的 DAO 异常层次结构,以便您可以在不更改任何代码的情况下切换连接器,因为操作语义保持不变。
对于需要本机库 API 的极端情况,提供专用方法 (),该方法返回用于通信的原始基础对象。 |
活动对象是通过创建的。此外,工厂充当对象,这意味着一旦声明,它们就允许您执行透明的异常转换。例如,您可以通过使用注释和 AOP 进行异常翻译。有关更多信息,请参阅 Spring 框架文档中的专用部分。RedisConnection
RedisConnectionFactory
PersistenceExceptionTranslator
@Repository
根据基础配置,工厂可以返回新连接或现有连接(使用池或共享本机连接时)。 |
使用 ais 通过 IoC 容器配置适当的连接器并将其注入 using 类的最简单方法。RedisConnectionFactory
遗憾的是,目前并非所有连接器都支持所有 Redis 功能。在连接 API 上调用基础库不支持的方法时,会引发 anis。以下概述介绍了各个 Redis 连接器支持的功能:UnsupportedOperationException
表 1.跨 Redis 连接器的功能可用性
支持的功能 | 生菜 | 杰迪斯 |
独立连接 | X | X |
主/副本连接 | X | |
雷迪斯哨兵 | 主查找、哨兵身份验证、副本读取 | 主查找 |
红地斯集群 | 群集连接、群集节点连接、副本读取 | 群集连接, 群集节点连接 |
运输渠道 | TCP, OS-native TCP (epoll, kqueue), Unix Domain Sockets | 技术合作计划(TCP |
连接池 | X(使用 | X(使用 |
其他连接功能 | 非阻塞命令的单一实例连接共享 | 流水线和事务互斥。无法在管道/事务中使用服务器/连接命令。 |
静态服务器支持 | X | X |
发布/订阅 | X | X |
流水线 | X | X(流水线和事务互斥) |
交易 | X | X(流水线和事务互斥) |
数据类型支持 | 键, 字符串, 列表, 设置, 排序集, 哈希, 服务器, 流, 脚本, 地理, 超日志日志 | 键, 字符串, 列表, 设置, 排序集, 哈希, 服务器, 脚本, 地理, 超级日志日志 |
反应式(非阻塞)API | X |
10.4.2. 配置生菜连接器
生菜是一个基于Netty 的开源连接器,由 Spring Data Redis 通过软件包支持。org.springframework.data.redis.connection.lettuce
将以下内容添加到 pom.xml 文件元素:dependencies
<dependencies>
<!-- other dependency elements omitted -->
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.2.1.RELEASE</version>
</dependency>
</dependencies>
以下示例演示如何创建新的生菜连接工厂:
@Configuration
class AppConfig
@Bean
public LettuceConnectionFactory redisConnectionFactory()
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));
还有一些特定于生菜的连接参数可以调整。默认情况下,the创建的所有实例为所有非阻塞和非事务性操作共享相同的线程安全本机连接。要每次都使用专用连接,setto.还可以配置为使用 afor 池阻塞和事务连接或 ifis 设置为的所有连接。LettuceConnection
LettuceConnectionFactory
shareNativeConnection
false
LettuceConnectionFactory
LettucePool
shareNativeConnection
false
Lettuce与Netty的本地传输集成,允许您使用Unix域套接字与Redis进行通信。请确保包含与运行时环境匹配的适当本机传输依赖项。以下示例演示如何为 Unix 域套接字创建生菜连接工厂:/var/run/redis.sock
@Configuration
class AppConfig
@Bean
public LettuceConnectionFactory redisConnectionFactory()
return new LettuceConnectionFactory(new RedisSocketConfiguration("/var/run/redis.sock"));
Netty目前支持用于操作系统原生传输的epoll(Linux)和kqueue(BSD/macOS)接口。 |
10.4.3. 配置 Jedis 连接器
Jedis是一个社区驱动的连接器,由Spring Data Redis模块通过软件包支持。org.springframework.data.redis.connection.jedis
将以下内容添加到 pom.xml 文件元素:dependencies
<dependencies>
<!-- other dependency elements omitted -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.3.1</version>
</dependency>
</dependencies>
在最简单的形式中,Jedis 配置如下所示:
@Configuration
class AppConfig
@Bean
public JedisConnectionFactory redisConnectionFactory()
return new JedisConnectionFactory();
但是,对于生产用途,您可能需要调整主机或密码等设置,如以下示例所示:
@Configuration
class RedisConfiguration
@Bean
public JedisConnectionFactory redisConnectionFactory()
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("server", 6379);
return new JedisConnectionFactory(config);
10.4.4. 写入主节点,从副本读取
Redis 主/副本设置 — 没有自动故障转移(有关自动故障转移,请参阅:Sentinel) — 不仅允许将数据安全地存储在更多节点上。它还允许通过使用Lettuce,从副本读取数据,同时将写入推送到主服务器。您可以设置要使用的读/写策略,如以下示例所示:LettuceClientConfiguration
@Configuration
class WriteToMasterReadFromReplicaConfiguration
@Bean
public LettuceConnectionFactory redisConnectionFactory()
LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
.readFrom(REPLICA_PREFERRED)
.build();
RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration("server", 6379);
return new LettuceConnectionFactory(serverConfig, clientConfig);
对于通过命令报告非公共地址的环境(例如,使用 AWS 时),请使用代替。请注意,不支持发布/订阅,因为缺少跨单个服务器的发布/订阅消息传播。 |
10.5. 雷迪斯哨兵支持
为了处理高可用性 Redis,Spring Data Redis 支持Redis Sentinel,如以下示例所示:RedisSentinelConfiguration
/**
* Lettuce
*/
@Bean
public RedisConnectionFactory lettuceConnectionFactory()
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("mymaster")
.sentinel("127.0.0.1", 26379)
.sentinel("127.0.0.1", 26380);
return new LettuceConnectionFactory(sentinelConfig);
/**
* Jedis
*/
@Bean
public RedisConnectionFactory jedisConnectionFactory()
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("mymaster")
.sentinel("127.0.0.1", 26379)
.sentinel("127.0.0.1", 26380);
return new JedisConnectionFactory(sentinelConfig);
配置属性
|
有时,需要与其中一个哨兵直接互动。使用或允许您访问配置的第一个活动哨兵。RedisConnectionFactory.getSentinelConnection()
RedisConnection.getSentinelCommands()
10.6. 通过 RedisTemplate 处理对象
大多数用户可能会使用及其相应的包,。事实上,该模板是 Redis 模块的核心类,因为它具有丰富的功能集。该模板为 Redis 交互提供了高级抽象。虽然提供接受和返回二进制值(数组)的低级方法,但模板负责序列化和连接管理,使用户免于处理此类细节。RedisTemplate
org.springframework.data.redis.core
RedisConnection
byte
此外,该模板还提供操作视图(遵循 Redis 命令参考中的分组),这些视图提供了丰富的通用接口,用于处理特定类型或特定键(通过接口),如下表所述:KeyBound
表 2.操作视图
接口 | 描述 |
键类型操作 | |
| Redis 地理空间操作,例如,,... |
| 红与人哈希操作 |
| Redis HyperLogLog 操作,例如,,... |
| 红地符号列表操作 |
| 红地集操作 |
| Redis 字符串(或值)操作 |
| Redis zset(或排序集)操作 |
键绑定操作 | |
| Redis 键绑定地理空间操作 |
| Redis 哈希键绑定操作 |
| Redis 键绑定操作 |
| Redis 列表键绑定操作 |
| Redis 设置键绑定操作 |
| Redis 字符串(或值)键绑定操作 |
| Redis zset(或排序集)键绑定操作 |
配置后,模板是线程安全的,可以在多个实例中重复使用。
RedisTemplate
使用基于 Java 的序列化程序进行大部分操作。这意味着模板写入或读取的任何对象都通过 Java 进行序列化和反序列化。您可以更改模板上的序列化机制,Redis 模块提供了多种实现,这些实现在包中可用。有关详细信息,请参阅序列化程序。您还可以将任何序列化程序设置为 null,并通过将属性设置为 来将 RedisTemplate 与原始字节数组一起使用。请注意,模板要求所有键均为非 null。但是,只要基础序列化程序接受值,它们就可以为 null。有关详细信息,请阅读每个序列化程序的 Javadoc。org.springframework.data.redis.serializer
enableDefaultSerializer
false
对于需要某个模板视图的情况,请将该视图声明为依赖项并注入模板。容器会自动执行转换,消除调用,如以下示例所示:opsFor[X]
爪哇岛
.XML
@Configuration
class MyConfig
@Bean
LettuceConnectionFactory redisConnectionFactory()
return new LettuceConnectionFactory();
@Bean
RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory)
RedisTemplate<String, String> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
public class Example
// inject the actual template
@Autowired
private RedisTemplate<String, String> template;
// inject the template as ListOperations
@Resource(name="redisTemplate")
private ListOperations<String, String> listOps;
public void addLink(String userId, URL url)
listOps.leftPush(userId, url.toExternalForm());
10.7. 以字符串为中心的便利类
由于存储在 Redis 中的键和值很常见,因此 Redis 模块提供了两个扩展和(及其实现),分别是 and,作为密集字符串操作的便捷一站式解决方案。除了绑定到密钥之外,模板和连接还使用 underneath,这意味着存储的密钥和值是人类可读的(假设在 Redis 和您的代码中使用相同的编码)。以下清单显示了一个示例:java.lang.String
RedisConnection
RedisTemplate
StringRedisConnection
DefaultStringRedisConnection
StringRedisTemplate
String
StringRedisSerializer
爪哇岛
.XML
@Configuration
class MyConfig
@Bean
LettuceConnectionFactory redisConnectionF以上是关于Spring Data(数据)Redis的主要内容,如果未能解决你的问题,请参考以下文章
用redis的scan命令代替keys命令,以及在spring-data-redis中遇到的问题
Spring之Redis访问(Spring-data-redis)