此版本仍在开发中,尚未被视为稳定版本。如需最新的稳定版本,请使用 Spring Data Redis 3.4.0! |
Drivers
使用 Redis 和 Spring 时,首要任务之一是通过 IoC 容器连接到 store。
为此,需要一个 Java 连接器(或绑定)。
无论您选择哪种库,您都只需使用一组 Spring Data Redis API(在所有连接器中的行为一致)。
用于处理和检索与 Redis 的活动连接的软件包及其接口。org.springframework.data.redis.connection
RedisConnection
RedisConnectionFactory
RedisConnection 和 RedisConnectionFactory
RedisConnection
为 Redis 通信提供核心构建块,因为它处理与 Redis 后端的通信。
它还会自动将底层连接库异常转换为 Spring 一致的 DAO 异常层次结构,以便您可以在不更改任何代码的情况下切换连接器,因为操作语义保持不变。
对于需要本机库 API 的极端情况,提供专用方法 () ,该方法返回用于通信的原始底层对象。RedisConnection getNativeConnection |
活动对象是通过 创建的。
此外,工厂充当对象,这意味着一旦声明,它们就允许您进行透明的异常转换。
例如,您可以通过使用 annotation 和 AOP 来执行异常转换。
有关更多信息,请参阅 Spring Framework 文档中的专用部分。RedisConnection
RedisConnectionFactory
PersistenceExceptionTranslator
@Repository
RedisConnection 类不是线程安全的。
虽然底层本机连接(例如 Lettuce's)可能是线程安全的,但 Spring Data Redis 的类本身不是。
因此,您不应在多个 Thread 之间共享 a 的实例。
对于事务性或阻塞性 Redis 操作和命令(如 .
例如,在事务和流水线操作中,保持无人看管的可变状态以正确完成操作,从而使其与多个 Thread 一起使用不安全。
这是设计使然。StatefulRedisConnection LettuceConnection RedisConnection BLPOP RedisConnection |
如果出于性能原因或其他原因,您需要跨多个线程共享(有状态)Redis 资源(如连接),则应获取本机连接并直接使用 Redis 客户端库(驱动程序)API。
或者,您可以使用 ,它以线程安全的方式获取和管理操作(和 Redis 命令)的连接。
有关更多详细信息,请参阅 上的文档。RedisTemplate RedisTemplate |
根据底层配置,工厂可以返回新连接或现有连接(当使用池或共享本机连接时)。 |
使用 a 的最简单方法是通过 IoC 容器配置适当的连接器,并将其注入到 using 类中。RedisConnectionFactory
遗憾的是,目前并非所有连接器都支持所有 Redis 功能。
在底层库不支持的 Connection API 上调用方法时,将引发 an。
以下概述介绍了各个 Redis 连接器支持的功能:UnsupportedOperationException
支持的功能 | 生菜 | 杰迪斯 |
---|---|---|
独立连接 |
X |
X |
X |
||
主查找、Sentinel 身份验证、副本读取 |
主查找 |
|
Cluster Connections, Cluster Node Connections, 副本读取 |
群集连接、群集节点连接 |
|
传输通道 |
TCP、操作系统原生 TCP (epoll、kqueue)、Unix 域套接字 |
TCP 协议 |
连接池 |
X(使用 |
X(使用 |
其他连接功能 |
非阻塞命令的单例连接共享 |
Pipelining 和 Transactions 互斥。无法在 pipeline/transactions 中使用 server/connection 命令。 |
SSL 支持 |
X |
X |
X |
X |
|
X |
X (流水线和事务互斥) |
|
X |
X (流水线和事务互斥) |
|
数据类型支持 |
键、字符串、列表、集、排序集、哈希、服务器、流、脚本、地理、HyperLogLog |
键、字符串、列表、集、排序集、哈希、服务器、流、脚本、地理、HyperLogLog |
反应式(非阻塞)API |
X |
配置 Lettuce 连接器
Lettuce 是一个基于 Netty 的开源连接器,由 Spring Data Redis 通过包支持。org.springframework.data.redis.connection.lettuce
dependencies
<dependencies>
<!-- other dependency elements omitted -->
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.3.2.RELEASE</version>
</dependency>
</dependencies>
以下示例显示了如何创建新的 Lettuce 连接工厂:
@Configuration
class AppConfig {
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));
}
}
还有一些特定于 Lettuce 的连接参数可以调整。
默认情况下,由创建的所有实例为所有非阻塞和非事务性操作共享相同的线程安全本机连接。
要每次都使用专用连接,请设置为 。 也可以配置为使用 a for pooling blocking and transactional connections 或 all connections(如果设置为 )。LettuceConnection
LettuceConnectionFactory
shareNativeConnection
false
LettuceConnectionFactory
LettucePool
shareNativeConnection
false
以下示例显示了一个更复杂的配置,包括 SSL 和 timeouts,它使用:LettuceClientConfigurationBuilder
@Bean
public LettuceConnectionFactory lettuceConnectionFactory() {
LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
.useSsl().and()
.commandTimeout(Duration.ofSeconds(2))
.shutdownTimeout(Duration.ZERO)
.build();
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("localhost", 6379), clientConfig);
}
有关更详细的客户端配置调整,请参阅 LettuceClientConfiguration
。
Lettuce 与 Netty 的本机传输集成,允许您使用 Unix 域套接字与 Redis 通信。
确保包含与您的运行时环境匹配的适当本机传输依赖项。
以下示例显示了如何在 Unix 域套接字中创建 Lettuce Connection 工厂:/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) 接口进行操作系统原生传输。 |
配置 Jedis 连接器
Jedis 是 Spring Data Redis 模块通过包支持的社区驱动的连接器。org.springframework.data.redis.connection.jedis
dependencies
<dependencies>
<!-- other dependency elements omitted -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.0.2</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);
}
}