Drivers
在使用 Redis 和 Spring 时首要任务之一是通过 IoC 容器连接到存储。为此,需要一个 Java 连接器(或绑定)。无论你选择哪个库,你都需要只使用一组 Spring Data Redis API(它们在所有连接器中表现一致)。包 org.springframework.data.redis.connection
及其接口 RedisConnection
和 RedisConnectionFactory
用于处理与 Redis 的活动连接以及检索这些连接。
RedisConnection and RedisConnectionFactory
RedisConnection
提供了 Redis 通信的核心部件,因为它处理与 Redis 后端的通信。它还将底层的连接库异常自动翻译为 Spring 的一致 {spring-framework-docs}/data-access.html#dao-exceptions[DAO 异常体系],这样你就可以在不进行任何代码更改的情况下切换连接器,因为操作语义保持不变。
对于需要本机库 API 的特殊情况, |
通过 RedisConnectionFactory
创建活动 RedisConnection
对象。此外,工厂充当 PersistenceExceptionTranslator
对象,这意味着声明后,它们让你进行透明异常翻译。例如,你可以通过使用 @Repository
注解和 AOP 来执行异常转换。有关更多信息,请参阅 Spring Framework 文档中专门的 {spring-framework-docs}/data-access.html#orm-exception-translation[部分]。
|
如果您需要出于性能原因或其他原因跨多个线程共享(有状态)Redis 资源(例如连接),那么您应获取本机连接并直接使用 Redis 客户端库(驱动程序)API。或者,您可以使用“ |
根据底层配置,工厂可以返回一个新连接或一个现有连接(当使用池或共享本机连接时)。 |
处理 RedisConnectionFactory
的最简单方法是通过 IoC 容器配置适当的连接器,并将其注入到使用该连接器的类中。
很遗憾,目前并不是所有连接器都支持所有的 Redis 功能。当调用底层库不支持的 Connection API 上的方法时,会引发 UnsupportedOperationException
。以下概述解释了各个 Redis 连接器支持的功能:
Supported Feature | Lettuce | Jedis |
---|---|---|
Standalone Connections |
X |
X |
X |
||
主查找、哨兵身份验证、副本读取 |
Master Lookup |
|
集群连接、集群节点连接、副本读取 |
集群连接、集群节点连接 |
|
Transport Channels |
TCP、操作系统原生 TCP(epoll、kqueue)、Unix 域套接字 |
TCP |
Connection Pooling |
X (using |
X (using |
Other Connection Features |
针对非阻塞命令启用单一连接共享 |
管道和事务互斥。无法在管道/事务中使用服务器/连接命令。 |
SSL Support |
X |
X |
X |
X |
|
X |
X(管道和事务互斥) |
|
X |
X(管道和事务互斥) |
|
Datatype support |
密钥、字符串、列表、集合、有序集合、哈希、服务器、流、脚本、地理、HyperLogLog |
密钥、字符串、列表、集合、有序集合、哈希、服务器、流、脚本、地理、HyperLogLog |
Reactive (non-blocking) API |
X |
Configuring the Lettuce Connector
Lettuce 是 Spring Data Redis 通过 org.springframework.data.redis.connection.lettuce
包支持的基于 Netty 的开源连接器。
dependencies
element:<dependencies>
<!-- other dependency elements omitted -->
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>{lettuce}</version>
</dependency>
</dependencies>
下面的示例展示了如何创建一个新的 Lettuce 连接工厂:
@Configuration
class AppConfig {
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));
}
}
还有几个 Lettuce 特定的连接参数可以微调。默认情况下,由 LettuceConnectionFactory
创建的所有 LettuceConnection
实例对于所有非阻塞和非事务操作共享同一个线程安全的本机连接。为了每次使用一个专用连接,将 shareNativeConnection
设置为 false
。也可以将 LettuceConnectionFactory
配置为对阻塞和事务连接使用 LettucePool
,或者在 shareNativeConnection
设置为 false
的情况下对所有连接使用。
下面的示例展示了一个更复杂的配置,包括 SSL 和超时,其中使用了 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 的 native transports 集成,让你可以使用 Unix 域套接字与 Redis 通信。请务必包含与运行时环境匹配的适当原生传输依赖项。以下示例演示如何为 /var/run/redis.sock
处的 Unix 域套接字创建 Lettuce Connection 工厂:
@Configuration
class AppConfig {
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(new RedisSocketConfiguration("/var/run/redis.sock"));
}
}
Netty 当前支持 epoll(Linux)和 kqueue(BSD/macOS)接口用于操作系统本机传输。 |
Configuring the Jedis Connector
Jedis 是由 Spring Data Redis 模块通过 org.springframework.data.redis.connection.jedis
包支持的社区驱动连接器。
dependencies
element:<dependencies>
<!-- other dependency elements omitted -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>{jedis}</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);
}
}