Spring Data Redis 教程

Last Modified: 2022/11/30

概述

Spring data redis 是 spring data 大家庭中的一部分,它让 spring 应用配置和访问 redis 变得简单。它提供了和 redis 交互的高层和低层抽象。下面是一些它支持的特性:

  • Connection 包作为多个 redis 驱动(Lettuce 和 Jedis)的低层抽象
  • 能够将 Redis 驱动异常转换为 Spring 兼容的数据访问异常(Data access exception);
  • RedisTemplate 则是一个高层抽象,封装了各种 redis 操作并提供了异常转换和序列化支持
  • Pubsub 支持;
  • Sentinel 和 Cluster 的支持;
  • Reactive API(仅支持 lettuce 驱动);
  • JDK、String、JSON 和 Spring Object/XML mapping 序列化器;
  • 基于 Redis 之上的 JDK 集合类的实现;
  • 提供了原子计数器支持类;
  • 排序和管道功能;
  • Spring 3.1 cache abstraction 的 redis 实现

注:以下使用 SDR 代替 spring data redis。本文将会聚焦上面加粗的特性。Spring Data Redis 2.x 要求 JDK 8.0 及以上,Spring Framework 5.3.24 及以上。

底层抽象

使用 redis 的第一步就是连接到 redis,SDR 的底层抽象体现在 org.springframework.data.redis.connection 包以及该包中的 RedisConnectionRedisConnectionFactory 接口,只需通过这套 API,我们便可获取 redis 连接并操作 redis。至于底层我们可以使用 Lettuce,也可以使用 Jedis,但我们无需关心底层驱动的 API,我们只要 SDR 提供的这一套 API。

虽然我们无需直接使用底层驱动的 API,但是 SDR 本身却依赖一个具体的底层驱动才能工作,因此我们想操作 redis,还需要选择一个底层驱动,Lettuce 和 Jedis 均可。

使用 Lettuce 驱动

使用 Lettuce 驱动,我们需要引入 lettuce 依赖,之后工作就是配置一个 LettuceConnectionFactory bean。

<dependency>
  <groupId>io.lettuce</groupId>
  <artifactId>lettuce-core</artifactId>
  <version>6.1.10.RELEASE</version>
</dependency>
@Configuration
class RedisConfig {
  @Bean
  public LettuceConnectionFactory redisConnectionFactory() {
    return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));
  }
}

通过 LettuceConnectionFactory 可以获取 RedisConnection,通过 connection 就可以和 redis 交互了。

// 由于使用了 lettuce 这里实际注入的是 LettuceConnectionFactory 对象。
@Resource
RedisConnectionFactory factory;

RedisConnection c = factory.getConnection();
c.set("myKey".getBytes(StandardCharsets.UTF_8), "v".getBytes(StandardCharsets.UTF_8));
c.close();

注:这是通过底层的方式和 redis 交互,这里仅仅为了演示底层 API 的使用,通常情况下我们会使用 RedisTemplate 和 redis 交互。底层方式毕竟不方便,可以看到上面的代码中我们需要自己将 key 和 value 序列化为字节。

使用 Jedis 驱动

使用 Jedis 驱动,我们需要引入 jedis 依赖,之后工作就是配置一个 JedisConnectionFactory bean。

<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>3.8.0</version>
</dependency>
@Configuration
class RedisConfig {
   @Bean
  public JedisConnectionFactory redisConnectionFactory() {
    RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("server", 6379);
    return new JedisConnectionFactory(config);
  }
}

通过 JedisConnectionFactory 可以获取 RedisConnection,通过 connection 就可以和 redis 交互了。

// 由于使用了 jedis 这里实际注入的是 JedisConnectionFactory 对象。
@Resource
RedisConnectionFactory factory;

RedisConnection c = factory.getConnection();
c.set("myKey".getBytes(StandardCharsets.UTF_8), "v".getBytes(StandardCharsets.UTF_8));
c.close();

可以看出这个地方和 redis 交互的代码和上面的一模一样,这便是抽象,底层使用了什么无所谓,我们只需要一套 API。

高层抽象

前面提到了底层抽象,SDR 还提供了和 redis 交互的高层抽象 RedisTemplate,RedisTemplate 内部不仅管理 redis 连接,还有内置序列化支持,我们可以直接操作对象,而不需要直接操作字节。在使用 RedisTemplate 之前先配置一个 bean:

@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory f) {
    RedisTemplate<Object, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(f);
    return template;
}

注:如果使用 spring boot,并且引入了 spring-boot-starter-data-redis,以上配置不再需要,RedisTemplate bean 会被自动配置。

Bean 配置完成之后,我们可以注入 RedisTemplate 并使用它和 redis 交互。redis 的各种数据结构,在 RedisTemplate 中都有对应的方法,而且这些方法都遵循一定的规则,均以 opsFor 开头:

  • 操作 string,可以使用 opsForValues;
  • 操作 list,可以使用 opsForList;
  • 操作 set,可以使用 opsForSet;
  • 操作 hash,可以使用 opsForHash;
  • 操作 zset,可以使用 opsForZSet;
// 操作 list
redisTemplate.opsForList.lPush("someKey", "someValue");

RedisTemplate 另外一个重要工作是提供序列化支持,默认使用 jdk 序列化实现,这种序列化实现对阅读不友好,我们可以配置使用 Jackson2JsonRedisSerializer 或 GenericJackson2JsonRedisSerializer。

Spring cache 的 redis 实现

这个之前的文章有说明,直接去这里看吧!

有问题吗?点此反馈!

温馨提示:反馈需要登录