整合 RedisTemplate
什么是 RedisTemplate ?
RedisTemplate 是 Spring Data Redis 提供的一个模板类,用于简化与 Redis 数据库的常见操作。它封装了与 Redis 交互的底层细节,提供了一套高层次的 API,使得开发人员可以更加方便地进行数据存储、检索和管理操作。
使用它的优势如下:
- 简化开发:
RedisTemplate提供了一套简单易用的 API,封装了底层细节,减少了开发人员的工作量,使得与 Redis 的交互更加直观和高效。 - 统一接口:提供了统一的接口来操作不同的数据结构,使得代码更加简洁和易读。
- 强大的配置能力:通过 Spring 的配置文件或注解,开发人员可以轻松配置
RedisTemplate的各项属性,如序列化方式、连接池配置等。 - 高性能:支持管道和批量操作,能够极大地提高 Redis 操作的性能,特别是在需要进行大量数据操作时。
- 扩展性强:可以结合 Spring 的其他功能模块,如 Spring AOP、Spring Security 等,构建更加复杂和功能丰富的应用程序。
- 可靠的序列化机制:通过配置不同的序列化方式,如
StringRedisSerializer、Jackson2JsonRedisSerializer等,确保数据存储和检索的效率和可读性。 - 与 Spring Boot 的无缝集成:Spring Boot 提供了自动配置,使用
RedisTemplate变得更加方便,只需简单配置即可使用。
添加依赖
编辑 xiaohashu-auth 认证服务的 pom.xml 文件,添加相关依赖:
// 省略...
<!-- Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Redis 连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
// 省略...
添加配置
接着,编辑 xiaohashu-auth 的 applicaiton-dev.yml 本地开发环境的配置文件,添加如下配置:
spring:
datasource:
// 省略...
data:
redis:
database: 0 # Redis 数据库索引(默认为 0)
host: 127.0.0.1 # Redis 服务器地址
port: 6379 # Redis 服务器连接端口
password: qwe123!@# # Redis 服务器连接密码(默认为空)
timeout: 5s # 读超时时间
connect-timeout: 5s # 链接超时时间
lettuce:
pool:
max-active: 200 # 连接池最大连接数
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
min-idle: 0 # 连接池中的最小空闲连接
max-idle: 10 # 连接池中的最大空闲连接
注意:配置项位于
spring节点下,并且和datasource同级,小伙伴们别配错位置了~
自定义 RedisTemplate
然后,在认证服务中创建 /config 配置包,并添加 RedisTemplateConfig 配置类,代码如下:
package com.quanxiaoha.xiaohashu.auth.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* @author: 犬小哈
* @date: 2024/4/6 15:51
* @version: v1.0.0
* @description: RedisTemplate 配置
**/
@Configuration
public class RedisTemplateConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// 设置 RedisTemplate 的连接工厂
redisTemplate.setConnectionFactory(connectionFactory);
// 使用 StringRedisSerializer 来序列化和反序列化 redis 的 key 值,确保 key 是可读的字符串
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// 使用 Jackson2JsonRedisSerializer 来序列化和反序列化 redis 的 value 值, 确保存储的是 JSON 格式
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
redisTemplate.setValueSerializer(serializer);
redisTemplate.setHashValueSerializer(serializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
测试一波
配置工作完成后,添加一个 RedisTests 单元测试类,准备来测试一波通过 RedisTemplate 操作 Redis 是否好使:
新增 key
首先编写一个新增 key 的单元测试,代码如下:
package com.quanxiaoha.xiaohashu.auth;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest
@Slf4j
class RedisTests {
@Resource
private RedisTemplate<String, Object> redisTemplate;
/**
* set key value
*/
@Test
void testSetKeyValue() {
// 添加一个 key 为 name, value 值为 犬小哈
redisTemplate.opsForValue().set("name", "犬小哈");
}
}
运行该单元测试,观察控制台日志,如无报错信息,打开 Redis 图形客户端,刷新一下,不出意外,就可以看到新增的 key 了
其他命令测试
再来测试一下其他比较常用的操作,如判断某个 key 是否存在、根据 key 获取 value 值、删除 key ,代码如下:
package com.quanxiaoha.xiaohashu.auth;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest
@Slf4j
class RedisTests {
@Resource
private RedisTemplate<String, Object> redisTemplate;
// 省略...
/**
* 判断某个 key 是否存在
*/
@Test
void testHasKey() {
log.info("key 是否存在:{}", Boolean.TRUE.equals(redisTemplate.hasKey("name")));
}
/**
* 获取某个 key 的 value
*/
@Test
void testGetValue() {
log.info("value 值:{}", redisTemplate.opsForValue().get("name"));
}
/**
* 删除某个 key
*/
@Test
void testDelete() {
redisTemplate.delete("name");
}
}

浙公网安备 33010602011771号