如需最新的稳定版本,请使用 Spring Data Redis 3.4.0spring-doc.cn

使用 Object throughRedisTemplate

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

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

此外,该模板还提供操作视图(遵循 Redis 命令参考中的分组),这些视图提供了丰富的泛型接口,用于处理特定类型或特定键(通过接口),如下表所述:KeyBoundspring-doc.cn

操作视图
接口 描述

键类型操作spring-doc.cn

GeoOperationsspring-doc.cn

Redis 地理空间操作,例如 、 ,...GEOADDGEORADIUSspring-doc.cn

HashOperationsspring-doc.cn

Redis 哈希操作spring-doc.cn

HyperLogLogOperationsspring-doc.cn

Redis HyperLogLog 操作,例如 、 ,...PFADDPFCOUNTspring-doc.cn

ListOperationsspring-doc.cn

Redis 列表操作spring-doc.cn

SetOperationsspring-doc.cn

Redis set 操作spring-doc.cn

ValueOperationsspring-doc.cn

Redis 字符串(或值)操作spring-doc.cn

ZSetOperationsspring-doc.cn

Redis zset(或排序集)操作spring-doc.cn

键绑定操作spring-doc.cn

BoundGeoOperationsspring-doc.cn

Redis 键绑定地理空间操作spring-doc.cn

BoundHashOperationsspring-doc.cn

Redis 哈希键绑定操作spring-doc.cn

BoundKeyOperationsspring-doc.cn

Redis 键绑定操作spring-doc.cn

BoundListOperationsspring-doc.cn

Redis list 键绑定操作spring-doc.cn

BoundSetOperationsspring-doc.cn

Redis set 键绑定操作spring-doc.cn

BoundValueOperationsspring-doc.cn

Redis 字符串(或值)键绑定操作spring-doc.cn

BoundZSetOperationsspring-doc.cn

Redis zset(或排序集)键绑定操作spring-doc.cn

接口 描述

键类型操作spring-doc.cn

ReactiveGeoOperationsspring-doc.cn

Redis 地理空间操作,例如 、 等)GEOADDGEORADIUSspring-doc.cn

ReactiveHashOperationsspring-doc.cn

Redis 哈希操作spring-doc.cn

ReactiveHyperLogLogOperationsspring-doc.cn

Redis HyperLogLog 操作,例如 (、 等)PFADDPFCOUNTspring-doc.cn

ReactiveListOperationsspring-doc.cn

Redis 列表操作spring-doc.cn

ReactiveSetOperationsspring-doc.cn

Redis set 操作spring-doc.cn

ReactiveValueOperationsspring-doc.cn

Redis 字符串(或值)操作spring-doc.cn

ReactiveZSetOperationsspring-doc.cn

Redis zset(或排序集)操作spring-doc.cn

配置后,模板是线程安全的,并且可以在多个实例之间重复使用。spring-doc.cn

RedisTemplate对大多数操作使用基于 Java 的序列化程序。 这意味着模板写入或读取的任何对象都通过 Java 进行序列化和反序列化。spring-doc.cn

您可以更改模板上的序列化机制,Redis 模块提供了多种实现,这些实现在软件包中可用。 有关更多信息,请参阅 序列化程序 。 您还可以将任何序列化程序设置为 null,并通过将属性设置为 RedisTemplate 将原始字节数组与原始字节数组一起使用。 请注意,模板要求所有键都为非 null。 但是,只要基础序列化程序接受值,值就可以为 null。 有关更多信息,请阅读每个序列化程序的 Javadoc。org.springframework.data.redis.serializerenableDefaultSerializerfalsespring-doc.cn

对于需要某个模板视图的情况,请将该视图声明为依赖项并注入模板。 容器自动执行转换,消除调用,如以下示例所示:opsFor[X]spring-doc.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>
使用 将项目推送到 List[Reactive]RedisTemplate
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 中的键和值很常见,因此 Redis 模块提供了两个扩展,分别是 和 (及其实现),并作为密集 String 操作的便捷一站式解决方案。 除了绑定到键之外,模板和连接还使用 under,这意味着存储的键和值是人类可读的(假设在 Redis 和您的代码中使用相同的编码)。 以下清单显示了一个示例:java.lang.StringRedisConnectionRedisTemplateStringRedisConnectionDefaultStringRedisConnectionStringRedisTemplateStringStringRedisSerializerspring-doc.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 模板一样,让您通过界面直接与 Redis 对话。 此功能为您提供了完全控制权,因为它直接与 . 请注意,回调接收 when a 被使用。 以下示例演示如何使用该接口:RedisTemplateStringRedisTemplateRedisCallbackRedisConnectionStringRedisConnectionStringRedisTemplateRedisCallbackspring-doc.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.cn

在 Spring Data 中,用户(自定义)类型和原始数据(反之亦然)之间的转换由包中的 Spring Data Redis 处理。org.springframework.data.redis.serializerspring-doc.cn

此包包含两种类型的序列化程序,顾名思义,它们负责序列化过程:spring-doc.cn

这些变体之间的主要区别在于,它们主要序列化到 ,而读取器和写入器使用 .RedisSerializerbyte[]ByteBufferspring-doc.cn

有多种实现可用(包括本文档中已经提到的两种实现):spring-doc.cn

但是,可以通过 Spring OXM 支持或 Jackson2JsonRedisSerializerGenericJackson2JsonRedisSerializer 用于 Object/XML 映射,以 JSON 格式存储数据。OxmSerializerspring-doc.cn

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

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

如果您担心 Java 序列化导致的安全漏洞,请考虑核心 JVM 级别的通用序列化过滤器机制:spring-doc.cn