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

通过 RedisTemplate 操作对象

大多数用户可能会使用 RedisTemplate 及其对应的包 org.springframework.data.redis.core,或其响应式变体 ReactiveRedisTemplate。 实际上,模板是 Redis 模块的核心类,因其功能丰富。 该模板为 Redis 交互提供了高级抽象。 虽然 [Reactive]RedisConnection 提供接受和返回二进制值(byte 数组)的低级方法,但模板负责序列化和连接管理,使开发者无需处理此类细节。spring-doc.cadn.net.cn

RedisTemplate 类实现了 RedisOperations 接口及其响应式变体 ReactiveRedisTemplate,后者实现了 ReactiveRedisOperationsspring-doc.cadn.net.cn

引用 [Reactive]RedisTemplate 实例上的操作的首选方式是通过 [Reactive]RedisOperations 接口。

此外,该模板还提供了操作视图(遵循 Redis 命令参考文档中的分组方式),如以下表格所述,这些视图提供了丰富且泛型化的接口,用于针对特定类型或特定键(通过 KeyBound 接口)进行操作:spring-doc.cadn.net.cn

运行视图

一旦配置完成,该模板就是线程安全的,可以在多个实例之间重复使用。spring-doc.cadn.net.cn

RedisTemplate 在其大部分操作中使用基于 Java 的序列化器。 这意味着该模板写入或读取的任何对象都会通过 Java 进行序列化和反序列化。spring-doc.cadn.net.cn

您可以在模板上更改序列化机制,Redis 模块提供了多种实现,这些实现在 org.springframework.data.redis.serializer 包中。 更多信息请参见序列化器(Serializers)。 您也可以将任意序列化器设置为 null,并通过将 enableDefaultSerializer 属性设为 false 来使用原始字节数组的 RedisTemplate。 请注意,模板要求所有键都必须非 null。 然而,只要底层序列化器接受 null 值,值就可以为 null。 更多详细信息,请阅读每个序列化器的 Javadoc。spring-doc.cadn.net.cn

对于需要特定模板视图的情况,请将视图声明为依赖项并注入该模板。 容器会自动执行转换,从而省去 opsFor[X] 调用,如下例所示:spring-doc.cadn.net.cn

配置模板 API
@Configuration
class MyConfig {

  @Bean
  LettuceConnectionFactory connectionFactory() {
    return new LettuceConnectionFactory();
  }

  @Bean
  RedisTemplate<String, String> redisTemplate(RedisConnectionFactory connectionFactory) {

    RedisTemplate<String, String> template = new RedisTemplate<>();
    template.setConnectionFactory(connectionFactory);
    return template;
  }
}
@Configuration
class MyConfig {

  @Bean
  LettuceConnectionFactory connectionFactory() {
    return new LettuceConnectionFactory();
  }

  @Bean
  ReactiveRedisTemplate<String, String> ReactiveRedisTemplate(ReactiveRedisConnectionFactory connectionFactory) {
    return new ReactiveRedisTemplate<>(connectionFactory, RedisSerializationContext.string());
  }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory"/>
  <!-- redis template definition -->
  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="redisConnectionFactory"/>
  ...

</beans>
使用 [Reactive]RedisTemplate 向 List 中推送元素
public class Example {

  // inject the actual operations
  @Autowired
  private RedisOperations<String, String> operations;

  // inject the template as ListOperations
  @Resource(name="redisTemplate")
  private ListOperations<String, String> listOps;

  public void addLink(String userId, URL url) {
    listOps.leftPush(userId, url.toExternalForm());
  }
}
public class Example {

  // inject the actual template
  @Autowired
  private ReactiveRedisOperations<String, String> operations;

  public Mono<Long> addLink(String userId, URL url) {
    return operations.opsForList().leftPush(userId, url.toExternalForm());
  }
}

面向字符串的便捷类

由于存储在 Redis 中的键和值通常是 java.lang.String 类型,因此 Redis 模块分别为 RedisConnectionRedisTemplate 提供了两个扩展:即 StringRedisConnection(及其 DefaultStringRedisConnection 实现)和 StringRedisTemplate,作为面向大量字符串操作的一站式便捷解决方案。 除了绑定到 String 类型的键之外,该模板和连接在底层使用了 StringRedisSerializer,这意味着所存储的键和值是人类可读的(前提是 Redis 和你的代码使用相同的编码)。 以下代码清单展示了一个示例:spring-doc.cadn.net.cn

@Configuration
class RedisConfiguration {

  @Bean
  LettuceConnectionFactory redisConnectionFactory() {
    return new LettuceConnectionFactory();
  }

  @Bean
  StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {

    StringRedisTemplate template = new StringRedisTemplate();
    template.setConnectionFactory(redisConnectionFactory);
    return template;
  }
}
@Configuration
class RedisConfiguration {

  @Bean
  LettuceConnectionFactory redisConnectionFactory() {
    return new LettuceConnectionFactory();
  }

  @Bean
  ReactiveStringRedisTemplate reactiveRedisTemplate(ReactiveRedisConnectionFactory factory) {
    return new ReactiveStringRedisTemplate<>(factory);
  }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory"/>

  <bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate" p:connection-factory-ref="redisConnectionFactory"/>

</beans>
public class Example {

  @Autowired
  private StringRedisTemplate redisTemplate;

  public void addLink(String userId, URL url) {
    redisTemplate.opsForList().leftPush(userId, url.toExternalForm());
  }
}
public class Example {

  @Autowired
  private ReactiveStringRedisTemplate redisTemplate;

  public Mono<Long> addLink(String userId, URL url) {
    return redisTemplate.opsForList().leftPush(userId, url.toExternalForm());
  }
}

与其他 Spring 模板类一样,RedisTemplateStringRedisTemplate 允许你通过 RedisCallback 接口直接与 Redis 进行交互。 此功能为你提供了完全的控制权,因为它直接与 RedisConnection 对象通信。 请注意,当使用 StringRedisConnection 时,回调方法接收到的是 StringRedisTemplate 的实例。 以下示例展示了如何使用 RedisCallback 接口:spring-doc.cadn.net.cn

public void useCallback() {

  redisOperations.execute(new RedisCallback<Object>() {
    public Object doInRedis(RedisConnection connection) throws DataAccessException {
      Long size = connection.dbSize();
      // Can cast to StringRedisConnection if using a StringRedisTemplate
      ((StringRedisConnection)connection).set("key", "value");
    }
   });
}

序列化器

从框架的角度来看,存储在 Redis 中的数据仅仅是字节。 尽管 Redis 本身支持多种类型,但这些类型在大多数情况下指的是数据的存储方式,而非其表示的内容。 由用户自行决定是否将这些信息转换为字符串或任何其他对象。spring-doc.cadn.net.cn

在 Spring Data 中,用户(自定义)类型与原始数据之间的转换(以及反向转换)由 Spring Data Redis 在 org.springframework.data.redis.serializer 包中处理。spring-doc.cadn.net.cn

该包包含两种类型的序列化器,顾名思义,它们负责处理序列化过程:spring-doc.cadn.net.cn

这些变体之间的主要区别在于,RedisSerializer 主要序列化为 byte[],而读取器和写入器则使用 ByteBufferspring-doc.cadn.net.cn

提供了多种实现方式(包括本文档中已提及的两种):spring-doc.cadn.net.cn

然而,可以通过 Spring OXM 支持使用 OxmSerializer 进行对象/XML 映射,或使用 JacksonJsonRedisSerializerGenericJacksonJsonRedisSerializerJSON 格式存储数据。spring-doc.cadn.net.cn

请注意,存储格式并不仅限于值。 它可以无任何限制地用于键、值或哈希。spring-doc.cadn.net.cn

默认情况下,RedisCacheRedisTemplate 被配置为使用 Java 原生序列化。 Java 原生序列化因允许运行远程代码而臭名昭著,这些代码是由利用易受攻击的库和类的负载注入未验证字节码所导致的。 被篡改的输入可能导致在反序列化步骤中在应用程序内运行不需要的代码。 因此,请勿在非可信环境中使用序列化。 通常,我们强烈建议使用任何其他消息格式(如 JSON)替代。spring-doc.cadn.net.cn

如果你担心 Java 序列化带来的安全漏洞,请考虑使用 JVM 核心层面的通用序列化过滤机制:spring-doc.cadn.net.cn