此版本仍在开发中,尚未被视为稳定版本。如需最新的稳定版本,请使用 Spring Data Redis 3.4.0spring-doc.cadn.net.cn

Drivers

使用 Redis 和 Spring 时,首要任务之一是通过 IoC 容器连接到 store。 为此,需要一个 Java 连接器(或绑定)。 无论您选择哪种库,您都只需使用一组 Spring Data Redis API(在所有连接器中的行为一致)。 这org.springframework.data.redis.connectionpackage 及其RedisConnectionRedisConnectionFactory用于处理和检索与 Redis 的活动连接的接口。spring-doc.cadn.net.cn

RedisConnection 和 RedisConnectionFactory

RedisConnection为 Redis 通信提供核心构建块,因为它处理与 Redis 后端的通信。 它还会自动将底层连接库异常转换为 Spring 一致的 DAO 异常层次结构,以便您可以在不更改任何代码的情况下切换连接器,因为作语义保持不变。spring-doc.cadn.net.cn

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

积极RedisConnection对象是通过RedisConnectionFactory. 此外,工厂还充当PersistenceExceptionTranslator对象,这意味着一旦声明,它们就允许您执行透明的异常转换。 例如,您可以通过使用@Repositoryannotation 和 AOP 的 API 中。 有关更多信息,请参阅 Spring Framework 文档中的专用部分spring-doc.cadn.net.cn

RedisConnection不是线程安全的。 虽然底层的原生连接(例如 Lettuce 的StatefulRedisConnection可能是线程安全的,Spring Data Redis 的LettuceConnection类本身不是。 因此,您不应共享RedisConnection跨多个线程。 对于事务性或阻塞性 Redis作和命令尤其如此,例如BLPOP. 例如,在事务和流水线作中,RedisConnectionhold 的 unguarded 可变状态来正确完成作,从而使其与多个 Thread 一起使用不安全。 这是设计使然。
如果出于性能原因或其他原因,您需要跨多个线程共享(有状态)Redis 资源(如连接),则应获取本机连接并直接使用 Redis 客户端库(驱动程序)API。 或者,您可以使用RedisTemplate,它以线程安全的方式获取和管理作(和 Redis 命令)的连接。 请参阅有关以下内容的文档RedisTemplate了解更多详情。
根据底层配置,工厂可以返回新连接或现有连接(当使用池或共享本机连接时)。

使用RedisConnectionFactory是通过 IoC 容器配置合适的连接器,并将其注入到 using 类中。spring-doc.cadn.net.cn

遗憾的是,目前并非所有连接器都支持所有 Redis 功能。 在底层库不支持的 Connection API 上调用方法时,UnsupportedOperationException被抛出。 以下概述介绍了各个 Redis 连接器支持的功能:spring-doc.cadn.net.cn

表 1.Redis 连接器的功能可用性
支持的功能 生菜 杰迪斯

独立连接spring-doc.cadn.net.cn

Xspring-doc.cadn.net.cn

Xspring-doc.cadn.net.cn

主/副本连接spring-doc.cadn.net.cn

Xspring-doc.cadn.net.cn

Redis 哨兵spring-doc.cadn.net.cn

主查找、Sentinel 身份验证、副本读取spring-doc.cadn.net.cn

主查找spring-doc.cadn.net.cn

Redis 集群spring-doc.cadn.net.cn

Cluster Connections, Cluster Node Connections, 副本读取spring-doc.cadn.net.cn

群集连接、群集节点连接spring-doc.cadn.net.cn

传输通道spring-doc.cadn.net.cn

TCP、作系统原生 TCP (epoll、kqueue)、Unix 域套接字spring-doc.cadn.net.cn

TCP 协议spring-doc.cadn.net.cn

连接池spring-doc.cadn.net.cn

X(使用commons-pool2)spring-doc.cadn.net.cn

X(使用commons-pool2)spring-doc.cadn.net.cn

其他连接功能spring-doc.cadn.net.cn

非阻塞命令的单例连接共享spring-doc.cadn.net.cn

Pipelining 和 Transactions 互斥。无法在 pipeline/transactions 中使用 server/connection 命令。spring-doc.cadn.net.cn

SSL 支持spring-doc.cadn.net.cn

Xspring-doc.cadn.net.cn

Xspring-doc.cadn.net.cn

发布/订阅spring-doc.cadn.net.cn

Xspring-doc.cadn.net.cn

Xspring-doc.cadn.net.cn

流水线spring-doc.cadn.net.cn

Xspring-doc.cadn.net.cn

X (流水线和事务互斥)spring-doc.cadn.net.cn

交易spring-doc.cadn.net.cn

Xspring-doc.cadn.net.cn

X (流水线和事务互斥)spring-doc.cadn.net.cn

数据类型支持spring-doc.cadn.net.cn

键、字符串、列表、集、排序集、哈希、服务器、流、脚本、地理、HyperLogLogspring-doc.cadn.net.cn

键、字符串、列表、集、排序集、哈希、服务器、流、脚本、地理、HyperLogLogspring-doc.cadn.net.cn

反应式(非阻塞)APIspring-doc.cadn.net.cn

Xspring-doc.cadn.net.cn

配置 Lettuce 连接器

Lettuce 是一个基于 Netty 的开源连接器,由 Spring Data Redis 通过org.springframework.data.redis.connection.lettuce包。spring-doc.cadn.net.cn

将以下内容添加到 pom.xml 文件中dependencies元素:
<dependencies>

  <!-- other dependency elements omitted -->

  <dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>6.4.1.RELEASE</version>
  </dependency>

</dependencies>

以下示例显示了如何创建新的 Lettuce 连接工厂:spring-doc.cadn.net.cn

@Configuration
class AppConfig {

  @Bean
  public LettuceConnectionFactory redisConnectionFactory() {

    return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));
  }
}

还有一些特定于 Lettuce 的连接参数可以调整。 默认情况下,所有LettuceConnectionLettuceConnectionFactory为所有非阻塞和非事务性作共享相同的线程安全本机连接。 要每次都使用专用连接,请将shareNativeConnectionfalse.LettuceConnectionFactory也可以配置为使用LettucePool对于池化阻塞连接和事务性连接或所有连接,如果shareNativeConnection设置为false.spring-doc.cadn.net.cn

以下示例显示了一个更复杂的配置,包括 SSL 和超时,该配置使用LettuceClientConfigurationBuilder:spring-doc.cadn.net.cn

@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.spring-doc.cadn.net.cn

Lettuce 与 Netty 的本机传输集成,允许您使用 Unix 域套接字与 Redis 通信。 确保包含与您的运行时环境匹配的适当本机传输依赖项。 以下示例显示了如何在/var/run/redis.sock:spring-doc.cadn.net.cn

@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包。spring-doc.cadn.net.cn

将以下内容添加到 pom.xml 文件中dependencies元素:
<dependencies>

  <!-- other dependency elements omitted -->

  <dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>5.2.0</version>
  </dependency>

</dependencies>

在最简单的形式中,Jedis 配置如下所示:spring-doc.cadn.net.cn

@Configuration
class AppConfig {

  @Bean
  public JedisConnectionFactory redisConnectionFactory() {
    return new JedisConnectionFactory();
  }
}

但是,对于生产用途,您可能需要调整主机或密码等设置,如以下示例所示:spring-doc.cadn.net.cn

@Configuration
class RedisConfiguration {

  @Bean
  public JedisConnectionFactory redisConnectionFactory() {

    RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("server", 6379);
    return new JedisConnectionFactory(config);
  }
}