SpringBoot之高级缓存Redis之自定义RedisTemplate

背景:

首先对于自定义的需求还请阅读上篇博客:

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,然后获取对象(该方案可行,不过还是建议按照上面的自定义方式解决比较简单)。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值