Drivers

在使用 Redis 和 Spring 时首要任务之一是通过 IoC 容器连接到存储。为此,需要一个 Java 连接器(或绑定)。无论你选择哪个库,你都需要只使用一组 Spring Data Redis API(它们在所有连接器中表现一致)。包 org.springframework.data.redis.connection 及其接口 RedisConnectionRedisConnectionFactory 用于处理与 Redis 的活动连接以及检索这些连接。

RedisConnection and RedisConnectionFactory

RedisConnection 提供了 Redis 通信的核心部件,因为它处理与 Redis 后端的通信。它还将底层的连接库异常自动翻译为 Spring 的一致 {spring-framework-docs}/data-access.html#dao-exceptions[DAO 异常体系],这样你就可以在不进行任何代码更改的情况下切换连接器,因为操作语义保持不变。

对于需要本机库 API 的特殊情况,RedisConnection 提供有专门方法 (getNativeConnection),用于返回用于通信的原始底层对象。

通过 RedisConnectionFactory 创建活动 RedisConnection 对象。此外,工厂充当 PersistenceExceptionTranslator 对象,这意味着声明后,它们让你进行透明异常翻译。例如,你可以通过使用 @Repository 注解和 AOP 来执行异常转换。有关更多信息,请参阅 Spring Framework 文档中专门的 {spring-framework-docs}/data-access.html#orm-exception-translation[部分]。

RedisConnection 类是 not 线程安全的。虽然基础本机连接(例如 Lettuce 的 StatefulRedisConnection)可能是线程安全的,但 Spring Data Redis 的 LettuceConnection 类本身却不是。因此,您应该 not 在多个线程中共享 RedisConnection 的实例。对于事务或阻塞 Redis 操作和命令(例如 BLPOP)而言尤其如此。例如,在事务和管道操作中,RedisConnection 拥有不受保护的可变状态以正确完成操作,因此不适合与多个线程一起使用。这是设计需要。

如果您需要出于性能原因或其他原因跨多个线程共享(有状态)Redis 资源(例如连接),那么您应获取本机连接并直接使用 Redis 客户端库(驱动程序)API。或者,您可以使用“ RedisTemplate”,它以线程安全的方式获取并管理操作(和 Redis 命令)的连接。有关详细信息,请参阅“ RedisTemplate”上的“ documentation”。

根据底层配置,工厂可以返回一个新连接或一个现有连接(当使用池或共享本机连接时)。

处理 RedisConnectionFactory 的最简单方法是通过 IoC 容器配置适当的连接器,并将其注入到使用该连接器的类中。

很遗憾,目前并不是所有连接器都支持所有的 Redis 功能。当调用底层库不支持的 Connection API 上的方法时,会引发 UnsupportedOperationException。以下概述解释了各个 Redis 连接器支持的功能:

Table 1. Feature Availability across Redis Connectors
Supported Feature Lettuce Jedis

Standalone Connections

X

X

Master/Replica Connections

X

Redis Sentinel

主查找、哨兵身份验证、副本读取

Master Lookup

Redis Cluster

集群连接、集群节点连接、副本读取

集群连接、集群节点连接

Transport Channels

TCP、操作系统原生 TCP(epoll、kqueue)、Unix 域套接字

TCP

Connection Pooling

X (using commons-pool2)

X (using commons-pool2)

Other Connection Features

针对非阻塞命令启用单一连接共享

管道和事务互斥。无法在管道/事务中使用服务器/连接命令。

SSL Support

X

X

Pub/Sub

X

X

Pipelining

X

X(管道和事务互斥)

Transactions

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 的开源连接器。

Add the following to the pom.xml files 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 包支持的社区驱动连接器。

Add the following to the pom.xml files 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);
  }
}