对于最新的稳定版本,请使用 Spring Data Redis 3.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Data Redis 3.3.1Spring中文文档

使用 Redis 和 Spring 时,首要任务之一是通过 IoC 容器连接到应用商店。 为此,需要 Java 连接器(或绑定)。 无论您选择哪种库,您只需要使用一组 Spring Data Redis API(在所有连接器中的行为一致)。 该软件包及其 和 接口,用于处理和检索与 Redis 的活动连接。org.springframework.data.redis.connectionRedisConnectionRedisConnectionFactorySpring中文文档

RedisConnection 和 RedisConnectionFactory

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

对于需要本机库 API 的极端情况,提供专用方法 () 返回用于通信的原始基础对象。RedisConnectiongetNativeConnection

活动对象是通过 创建的。 此外,工厂充当对象,这意味着一旦声明,它们就允许您执行透明的异常转换。 例如,您可以通过使用注释和 AOP 来执行异常转换。 有关更多信息,请参阅 Spring Framework 文档中的专用部分RedisConnectionRedisConnectionFactoryPersistenceExceptionTranslator@RepositorySpring中文文档

RedisConnection不是线程安全的。 虽然底层的本机连接(例如 Lettuce 的 )可能是线程安全的,但 Spring Data Redis 的类本身却不是。 因此,不应跨多个线程共享 a 的实例。 对于事务性或阻塞性 Redis 操作和命令(例如 . 例如,在事务和流水线操作中,保留不受保护的可变状态以正确完成操作,从而使得与多个线程一起使用是不安全的。 这是设计使然。StatefulRedisConnectionLettuceConnectionRedisConnectionBLPOPRedisConnection
如果出于性能原因或其他原因需要跨多个线程共享(有状态)Redis 资源(如连接),则应获取本机连接并直接使用 Redis 客户端库(驱动程序)API。 或者,您可以使用 ,它以线程安全的方式获取和管理操作(和 Redis 命令)的连接。 有关更多详细信息,请参阅文档。RedisTemplateRedisTemplate
根据基础配置,出厂时可以返回新连接或现有连接(当使用池或共享本机连接时)。

使用 a 的最简单方法是通过 IoC 容器配置适当的连接器,并将其注入 using 类。RedisConnectionFactorySpring中文文档

遗憾的是,目前并非所有连接器都支持所有 Redis 功能。 在基础库不支持的连接 API 上调用方法时,将抛出 an。 以下概述介绍了各个 Redis 连接器支持的功能:UnsupportedOperationExceptionSpring中文文档

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

独立连接Spring中文文档

XSpring中文文档

XSpring中文文档

主/副本连接Spring中文文档

XSpring中文文档

Redis Sentinel(瑞迪斯哨兵酒店)Spring中文文档

主查找、哨兵身份验证、副本读取Spring中文文档

主查询Spring中文文档

Redis 集群Spring中文文档

群集连接、群集节点连接、副本读取Spring中文文档

群集连接、群集节点连接Spring中文文档

运输渠道Spring中文文档

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

技术合作计划(TCP)Spring中文文档

连接池Spring中文文档

X(使用commons-pool2)Spring中文文档

X(使用commons-pool2)Spring中文文档

其他连接功能Spring中文文档

非阻塞命令的单例连接共享Spring中文文档

流水线和事务互斥。不能在管道/事务中使用服务器/连接命令。Spring中文文档

SSL 支持Spring中文文档

XSpring中文文档

XSpring中文文档

发布/订阅Spring中文文档

XSpring中文文档

XSpring中文文档

流水线Spring中文文档

XSpring中文文档

X(流水线和事务互斥)Spring中文文档

交易Spring中文文档

XSpring中文文档

X(流水线和事务互斥)Spring中文文档

数据类型支持Spring中文文档

键、字符串、列表、集、排序集、哈希、服务器、流、脚本、地理、HyperLogLogSpring中文文档

键、字符串、列表、集、排序集、哈希、服务器、流、脚本、地理、HyperLogLogSpring中文文档

反应式(非阻塞)APISpring中文文档

XSpring中文文档

对于需要本机库 API 的极端情况,提供专用方法 () 返回用于通信的原始基础对象。RedisConnectiongetNativeConnection
RedisConnection不是线程安全的。 虽然底层的本机连接(例如 Lettuce 的 )可能是线程安全的,但 Spring Data Redis 的类本身却不是。 因此,不应跨多个线程共享 a 的实例。 对于事务性或阻塞性 Redis 操作和命令(例如 . 例如,在事务和流水线操作中,保留不受保护的可变状态以正确完成操作,从而使得与多个线程一起使用是不安全的。 这是设计使然。StatefulRedisConnectionLettuceConnectionRedisConnectionBLPOPRedisConnection
如果出于性能原因或其他原因需要跨多个线程共享(有状态)Redis 资源(如连接),则应获取本机连接并直接使用 Redis 客户端库(驱动程序)API。 或者,您可以使用 ,它以线程安全的方式获取和管理操作(和 Redis 命令)的连接。 有关更多详细信息,请参阅文档。RedisTemplateRedisTemplate
根据基础配置,出厂时可以返回新连接或现有连接(当使用池或共享本机连接时)。
表 1.跨 Redis 连接器的功能可用性
支持的功能 生菜 杰迪斯

独立连接Spring中文文档

XSpring中文文档

XSpring中文文档

主/副本连接Spring中文文档

XSpring中文文档

Redis Sentinel(瑞迪斯哨兵酒店)Spring中文文档

主查找、哨兵身份验证、副本读取Spring中文文档

主查询Spring中文文档

Redis 集群Spring中文文档

群集连接、群集节点连接、副本读取Spring中文文档

群集连接、群集节点连接Spring中文文档

运输渠道Spring中文文档

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

技术合作计划(TCP)Spring中文文档

连接池Spring中文文档

X(使用commons-pool2)Spring中文文档

X(使用commons-pool2)Spring中文文档

其他连接功能Spring中文文档

非阻塞命令的单例连接共享Spring中文文档

流水线和事务互斥。不能在管道/事务中使用服务器/连接命令。Spring中文文档

SSL 支持Spring中文文档

XSpring中文文档

XSpring中文文档

发布/订阅Spring中文文档

XSpring中文文档

XSpring中文文档

流水线Spring中文文档

XSpring中文文档

X(流水线和事务互斥)Spring中文文档

交易Spring中文文档

XSpring中文文档

X(流水线和事务互斥)Spring中文文档

数据类型支持Spring中文文档

键、字符串、列表、集、排序集、哈希、服务器、流、脚本、地理、HyperLogLogSpring中文文档

键、字符串、列表、集、排序集、哈希、服务器、流、脚本、地理、HyperLogLogSpring中文文档

反应式(非阻塞)APISpring中文文档

XSpring中文文档

配置 Lettuce 连接器

Lettuce 是一个基于 Netty 的开源连接器,由 Spring Data Redis 通过包支持。org.springframework.data.redis.connection.lettuceSpring中文文档

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

  <!-- other dependency elements omitted -->

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

</dependencies>

以下示例演示如何创建新的 Lettuce 连接工厂:Spring中文文档

@Configuration
class AppConfig {

  @Bean
  public LettuceConnectionFactory redisConnectionFactory() {

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

还有一些特定于生菜的连接参数可以调整。 默认情况下,由创建的所有实例共享相同的线程安全本机连接,用于所有非阻塞和非事务性操作。 若要每次都使用专用连接,请设置为 。 如果设置为 ,也可以配置为使用 用于池化阻塞和事务连接或所有连接(如果设置为 )。LettuceConnectionLettuceConnectionFactoryshareNativeConnectionfalseLettuceConnectionFactoryLettucePoolshareNativeConnectionfalseSpring中文文档

以下示例显示了一个更复杂的配置,包括 SSL 和超时,它使用:LettuceClientConfigurationBuilderSpring中文文档

@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);
}

有关更详细的客户端配置调整,请参阅 LettuceClientConfigurationSpring中文文档

Lettuce 与 Netty 的原生传输集成,让您使用 Unix 域套接字与 Redis 通信。 请确保包含与运行时环境匹配的相应本机传输依赖项。 以下示例显示了如何为 Unix 域套接字创建 Lettuce Connection 工厂,地址为 :/var/run/redis.sockSpring中文文档

@Configuration
class AppConfig {

  @Bean
  public LettuceConnectionFactory redisConnectionFactory() {

    return new LettuceConnectionFactory(new RedisSocketConfiguration("/var/run/redis.sock"));
  }
}
Netty 目前支持用于操作系统原生传输的 epoll (Linux) 和 kqueue (BSD/macOS) 接口。
Netty 目前支持用于操作系统原生传输的 epoll (Linux) 和 kqueue (BSD/macOS) 接口。

配置 Jedis 连接器

Jedis 是一个社区驱动的连接器,由 Spring Data Redis 模块通过包支持。org.springframework.data.redis.connection.jedisSpring中文文档

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

  <!-- other dependency elements omitted -->

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

</dependencies>

在最简单的形式中,Jedis 配置如下所示:Spring中文文档

@Configuration
class AppConfig {

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

但是,对于生产用途,您可能需要调整主机或密码等设置,如以下示例所示:Spring中文文档

@Configuration
class RedisConfiguration {

  @Bean
  public JedisConnectionFactory redisConnectionFactory() {

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