Spring Data Redis 教程
概述
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
包以及该包中的 RedisConnection
和 RedisConnectionFactory
接口,只需通过这套 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 实现
这个之前的文章有说明,直接去这里看吧!。
温馨提示:反馈需要登录