hooyantsing's Blog

26_自定义RedisTemplate

字数统计: 406阅读时长: 1 min
2020/08/18

26 自定义RedisTemplate

Redis最新超详细版教程通俗易懂

SpringBoot提供的RedisTemplate有什么问题?

1
2
3
4
# 将对象存入 Redis
redisTemplate.opsForValue().set("user",new UserPOJO("hooy",18));
# 将对象从 Redis 取出
System.out.println(redisTemplate.opsForValue().get("user"));

以上代码,在 SpringBoot 里存取正常,但在 Redis 里存在问题,如下图:

可见,通过 key 取不到对应的 value。4f83e2c64951a1cb8a5483dee4b1e5fc.png

SpringBoot提供的RedisTemplate默认将对象序列化的方式是 JDK序列化

解决方式:

自定义 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.kuang.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
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;

@Configuration
public class RedisConfig {

/**
* 自定义 RedisTemplate , 替换掉 RedisAutoConfiguration.java 类里的 redisTemplate
* 自定义内容: 改变了某些类型的序列化方式。 默认是使用JDK序列化。
*/

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

// Jackson 方式序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// String 方式序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

// String 类型的 key 使用 String方式序列化
template.setKeySerializer(stringRedisSerializer);
// Hash 类型的 key 使用 String方式序列化
template.setHashKeySerializer(stringRedisSerializer);
// String 类型的 value 使用 jackson方式序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
// Hash 类型的 value 使用 jackson方式序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);

template.afterPropertiesSet();
return template;
}
}

由于默认的 RedisTemplate 上有 @ConditionalOnMissingBean(name = {“redisTemplate”}) 注解,因此当存在自定义的 RedisTemplate 时,默认 RedisTemplate 将不执行。

结果

key 不存在转义符了。

d1fc6ab3ee9287b8f2d3470eae7a2d7d.png

CATALOG
  1. 1. 26 自定义RedisTemplate
    1. 1.1. SpringBoot提供的RedisTemplate有什么问题?
      1. 1.1.1. 解决方式:
      2. 1.1.2. 结果