此版本仍在开发中,尚未被视为稳定版本。如需最新的稳定版本,请使用 Spring Data Redis 3.4.0! |
Drivers
使用 Redis 和 Spring 时,首要任务之一是通过 IoC 容器连接到 store。
为此,需要一个 Java 连接器(或绑定)。
无论您选择哪种库,您都只需使用一组 Spring Data Redis API(在所有连接器中的行为一致)。
这org.springframework.data.redis.connection
package 及其RedisConnection
和RedisConnectionFactory
用于处理和检索与 Redis 的活动连接的接口。
RedisConnection 和 RedisConnectionFactory
RedisConnection
为 Redis 通信提供核心构建块,因为它处理与 Redis 后端的通信。
它还会自动将底层连接库异常转换为 Spring 一致的 DAO 异常层次结构,以便您可以在不更改任何代码的情况下切换连接器,因为作语义保持不变。
对于需要本机库 API 的极端情况,RedisConnection 提供专用方法 (getNativeConnection ),该对象返回用于通信的原始底层对象。 |
积极RedisConnection
对象是通过RedisConnectionFactory
.
此外,工厂还充当PersistenceExceptionTranslator
对象,这意味着一旦声明,它们就允许您执行透明的异常转换。
例如,您可以通过使用@Repository
annotation 和 AOP 的 API 中。
有关更多信息,请参阅 Spring Framework 文档中的专用部分。
RedisConnection 类不是线程安全的。
虽然底层的原生连接(例如 Lettuce 的StatefulRedisConnection 可能是线程安全的,Spring Data Redis 的LettuceConnection 类本身不是。
因此,您不应共享RedisConnection 跨多个线程。
对于事务性或阻塞性 Redis作和命令尤其如此,例如BLPOP .
例如,在事务和流水线作中,RedisConnection hold 的 unguarded 可变状态来正确完成作,从而使其与多个 Thread 一起使用不安全。
这是设计使然。 |
如果出于性能原因或其他原因,您需要跨多个线程共享(有状态)Redis 资源(如连接),则应获取本机连接并直接使用 Redis 客户端库(驱动程序)API。
或者,您可以使用RedisTemplate ,它以线程安全的方式获取和管理作(和 Redis 命令)的连接。
请参阅有关以下内容的文档RedisTemplate 了解更多详情。 |
根据底层配置,工厂可以返回新连接或现有连接(当使用池或共享本机连接时)。 |
使用RedisConnectionFactory
是通过 IoC 容器配置合适的连接器,并将其注入到 using 类中。
遗憾的是,目前并非所有连接器都支持所有 Redis 功能。
在底层库不支持的 Connection API 上调用方法时,UnsupportedOperationException
被抛出。
以下概述介绍了各个 Redis 连接器支持的功能:
支持的功能 | 生菜 | 杰迪斯 |
---|---|---|
独立连接 |
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.4.1.RELEASE</version>
</dependency>
</dependencies>
以下示例显示了如何创建新的 Lettuce 连接工厂:
@Configuration
class AppConfig {
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));
}
}
还有一些特定于 Lettuce 的连接参数可以调整。
默认情况下,所有LettuceConnection
由LettuceConnectionFactory
为所有非阻塞和非事务性作共享相同的线程安全本机连接。
要每次都使用专用连接,请将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 的本机传输集成,允许您使用 Unix 域套接字与 Redis 通信。
确保包含与您的运行时环境匹配的适当本机传输依赖项。
以下示例显示了如何在/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.2.0</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);
}
}