SpringBoot使用RedisTemplate来操作Redis
Manny

RedisTemplate 是 Spring Framework 中用于与 Redis 数据库进行交互的核心类之一。它提供了一种方便的方式来执行各种 Redis 操作,包括数据存储、读取、更新和删除等。和 Jedis、Lettuce类似,它们都是与 Redis 数据库进行交互的 Java 客户端库。


自定义RedisTemplate

SpringBoot默认提供的是 RedisTemplate<Object,Object> ,可以在 RedisAutoConfiguration 中查看详情,不适合日常使用。因此我们需要自定义一个 RedisTemplate 并注入到容器中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@Configuration
public class RedisConfig {

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);

// 使用Jackson2JsonRedisSerializer来序列化和反序列化Redis的值
Jackson2JsonRedisSerializer<Object> jacksonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);

// 如果直接使用Jackson2JsonRedisSerializer 获取存储的对象则会变为LinkedHashMap,添加ObjectMapper可解决
ObjectMapper objectMapper = new ObjectMapper();
/**
* 配置 Jackson ObjectMapper 的默认类型信息处理方式
* objectMapper.getPolymorphicTypeValidator():这是一个类型验证器,用于验证多态类型的完整性和安全性。
* ObjectMapper.DefaultTyping.NON_FINAL:类型信息的默认处理方式
* JsonTypeInfo.As.PROPERTY:类型信息将作为 JSON 属性包含在对象中
*/
objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
//Jackson 会在反序列化时,如果遇到未知的属性(即 JSON 数据中包含了 Java 对象中没有的属性),抛出 UnrecognizedPropertyException 异常
//忽略未知属性而不抛出异常
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
jacksonSerializer.setObjectMapper(objectMapper);

//key采用StringRedisSerializer
template.setKeySerializer(new StringRedisSerializer());
//value采用jacksonSerializer
template.setValueSerializer(jacksonSerializer);
return template;
}

}

创建工具类 RedisUtil

有了 RedisTemplate 后就可以简单的操作Redis数据库了。为了方便,我们可以创建一个工具类,封装一些简单的操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class RedisUtil {
@Autowired
private RedisTemplate<String, Object> redisTemplate;

// 存储数据
public void set(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}

// 获取数据
public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}

// 设置过期时间(秒)
public boolean expire(String key, long timeout) {
return redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
}

// 删除数据
public boolean delete(String key) {
return redisTemplate.delete(key);
}

}
 评论