这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战
hello,你好呀,我是灰小猿,一个超会写bug的程序猿!
平常我们在进行企业级项目开发使用Redis的时候,都会用到自定义的RedisTemplate,今天我们就来讲一下如何实现这一操作。
自定义RedisTemplate
自定义redisTemplate是在日常开发中经常要用到的一项操作,我们先来科普一点,Redis在存储数据的时候,底层默认使用的是JBK的方式进行序列化的,而这种方式,往往会将我们存储的非string类型的数据转义成一堆乱码,不利于实际的开发。
原始序列化方式测试
我们以一个实例来分析一下:
建立一个User类:
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User implements Serializable {
private String name;
private int age;
}
使用redisTemplate类来输入一个user类型的键值对,并获取输入的值:
@Autowired
private RedisTemplate redisTemplate;
@Test
public void redisTest08() {
User user = new User("灰小猿", 5);
redisTemplate.opsForValue().set("user", user);
System.out.println("获取到的数值:");
System.out.println(redisTemplate.opsForValue().get("user"));
}
执行结果为:
获取到的数值:
User(name=灰小猿, age=5)
我们可以看到现在Redis是以默认的JBK的方式进行序列化的。得到的结果如上。
但是现在的项目更多的是采用的前后端分离的方式进行的,数据的传输一般都是以JSON的形式,尤其是对象的传输,
原因是:JSON 语法格式简单、层次结构清晰、并且在数据交换方面,JSON 所使用的字符要比 XML 少得多,可以大大得节约传输数据所占用的带宽。
所以对于Redis中的数据,在实际开发中,我们一般也会将其存储为JSON的形式,这个时候就需要我们通过自定义redisTemplate的方式将Redis默认的序列化方式改为JSON的形式,
自定义redisTemplate的方法
自定义redisTemplate的方法是:新建一个配置类RedisConfig,在其中注入一个Bean,并实现自定义的序列化方法。完整的自定义配置类如下:这个一般是企业开发的固定模板,作用是将Redis默认的序列化方式改为JSON的方式。下面的这个配置类,在开发中可以直接拿过来用即可!
/**
* 自定义redisTemplate
* 解决实现序列化
*
* @author YunGang.Guo
* @date 2021/12/27 14:45
**/
@Configuration
public class RedisConfig {
/**
* 编写自己的redisTemplate
*
* @param factory
* @return
*/
@Bean("redisTemplate")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
// 为了开发方便,一般都使用<String, Object>类型
RedisTemplate<String, Object> template = new RedisTemplate();
// 连接工厂
template.setConnectionFactory(factory);
// 序列化配置
FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
// value值的序列化采用FastJsonRedisSerializer
template.setValueSerializer(fastJsonRedisSerializer);
// hash值的序列化采用FastJsonRedisSerializer的方式
template.setHashValueSerializer(fastJsonRedisSerializer);
// key的序列化采用StringRedisSerializer
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
// hash的key的序列化采用StringRedisSerializer的方式
template.setHashKeySerializer(stringRedisSerializer);
return template;
}
}
完成自定义配置类之后,我们再来执行上面的测试方法:
@Autowired
private RedisTemplate redisTemplate;
@Test
public void redisTest08() {
User user = new User("灰小猿", 5);
redisTemplate.opsForValue().set("user", user);
System.out.println("获取到的数值:");
System.out.println(redisTemplate.opsForValue().get("user"));
}
得到的运行结果为:
获取到的数值:
{"name":"灰小猿","age":5}
可以发现明显与默认的存储方法不同,现在我们存储在Redis中的对象,就会自动以JSON的方式进行序列化并存储啦!
我是灰小猿,我们下期见!