背景:
首先对于自定义的需求还请阅读上篇博客:
SpringBoot之高级缓存Redis之开发入门 在里面讲解了Redis的入门使用,其实Redis缓存就可以简单理解为一种数据库操作,将数据不存放在本地为了消减对内存的消耗同时提高程序的性能,不过已经有SpringBoot给我们提供了相关的公共包为什么还需要进行相关的自定义RedisTemplate呢,答案很简单,RedisTemplate是一种key - value均为对象的一种存储,所以默认的存放在Redis中的数据是一种序列化的。而在开发过程中我们需要的可能就是明文对象,方便查看信息。
自定义前的数据存放情况:
步骤:
首先就是自定义RedisTemplate,创建一个Java 文件作为配置类
@Configuration
public class MyRedisConfig {
@Bean
//这里是自定义了一个Employee的RedisTemplate,后面有其他的需求可以直接按照需求进行相关的开发。
public RedisTemplate<Object, Employee> empRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Employee> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
//这里要序列化的对象为Employee。后面开发可以直接将需要序列化的对象直接写一个相同RedisTemplate的就可以。
Jackson2JsonRedisSerializer<Employee> serializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
redisTemplate.setDefaultSerializer(serializer);
return redisTemplate;
}
}
然后就是具体的测试:
/*
* 方式2:自定义对象的RedisTemplate进行转换
*/
@Autowired
RedisTemplate<Object,Employee> empRedisTemplate;
@Test
public void test04(){
System.out.println("Redis相关的测试针对redisTemplate对象操作");
//查询用户数据
Employee empById = employeeMapper.getEmpById(1);
//下面是通过String 作为key,同时object作为Value,一般使用这种情况。
empRedisTemplate.opsForValue().set("emp-01",empById);
//下面是通过object 作为key,同时object作为Value。一般不使用。
empRedisTemplate.opsForValue().set(empById,empById);
}
存放Redis数据库的效果,存放在数据库中的数据明显的就是我们需要的对象明文形式:
最后给大家测试一下如何从Redis中获取该对象。
@Test
public void test05(){
System.out.println("Redis相关的测试针对redisTemplate对象操作");
//从Redis中获取Employee对象。
Employee employee=empRedisTemplate.opsForValue().get("emp-01");
//输出对象的时候,会自动的执行toString函数
System.out.println("获取的employee对象为:"+employee);
System.out.println("获取的employee对象为:"+employee.toString());
System.out.println("获取的employee对象的Did号为:"+employee.getdId());
}
打印结果:
2020-07-22 10:59:51.600 INFO 15928 --- [ main] io.lettuce.core.KqueueProvider : Starting without optional kqueue library
获取的employee对象为:Employee [id=1, lastName=null, email=33@55, gender=1, dId=8989]
获取的employee对象为:Employee [id=1, lastName=null, email=33@55, gender=1, dId=8989]
获取的employee对象为:8989
注意:
解决存放对象过程中数据序列化的问题还有一种解决方案,那就是采用将对象先使用Json工具包转为Json字符串,然后就可以按照上一篇的方式1或者2都可以存放数据库,然后数据的类型为字符串,不过当获取后需要多一步骤,那就是将获取的Json字符串先进行解Json,然后获取对象(该方案可行,不过还是建议按照上面的自定义方式解决比较简单)。