SpringBoot环境下使用Redis的那点事(三)

接着上文:
这里写图片描述
然后先看一下redis数据库:
这里写图片描述
这里写图片描述
可以看到数据是已经被存储到数据库中了,也就是说redisTest6方法被正确执行了,那么为什么会报错呢?
我们先看一下这个:
@Override
public void redisTest6() {
System.out.println(this.redisTemplate.getHashKeySerializer());
System.out.println(this.redisTemplate.getHashValueSerializer());
// this.redisTemplate.opsForHash().put(“userCache::redisTemplateDemo6”, “mykey”, “myvalue”);
}
然后看控制台:
这里写图片描述
这里写图片描述
这里写图片描述
}
既然opsForHash有自己的序列化方式,那么我又不想去覆盖它,所以我们换成opsForList(为什么要传一个map还记得之前讲的吗,如果value的序列化方式改成通过json来进行转换的话,传入的值必须得符合json的格式要求),它可没有自己单独的序列化方式,使用的就是:
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(new StringRedisSerializer());
这下序列化的方式都统一了,应该不会报错了吧:
@Test
public void contextLoads() {
this.sysService.redisTest6();
Object u=(Object)this.sysService.redisTest7(“redisTemplateDemo8”);
System.out.println(u.toString());
}这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
所以我们可以分析一下为什么会报错了,因为我们在存储这个数据的时候:
this.redisTemplate.opsForList().leftPush(“userCache::redisTemplateDemo8”, m);
使用的是opsForList,所以它存储的数据到数据库中是类似于list集合的数据结构,简单点来说,只能通过lrange指令来获取,而注解都是通过get指令来获取缓存数据的,只能获取通过set指令存储的数据,所以当然无法获取我们例子中的数据。
我们可以在redis-cli中通过lrange指令来获取(因为我们测试的过程中多次调用了leftPush所以存了很多)
这里写图片描述
所以说了这么多,其实总结起来很简单,我们使用redisTemplate来进行缓存操作的话,如果你缓存的数据后期不需要通过注解的方式来获取,或者你不需要通过redisTemplate来获取注解缓存的数据,那么不管是opsForValue还是opsForList,或者是opsForHash,都是可以的,只要符合你的使用需求,随心所欲。

但是如果后期要与注解混合使用,那么除了保证key和value的序列化方式与注解的一致之外,我们必须使用opsForValue来进行数据的缓存操作,因为只有这个方法最终采用的set或get等指令来与缓存数据库交互的,而恰恰注解最终也是通过set或get等指令来与数据库进行交互。

看上去好像有限制,其实我们会发现redisTemplate提供的opsForValue方法操作的数据是一个Object类型的,也就是说不管你是用来存储对象,集合还是其他数据类型,其实都可以通过opsForValue来进行操作,最终通过set命令存储到数据库的都变成了简单数据结构类型。
这里写图片描述
最后的最后我们总结一下,如果不是实际需求需要,那么我们在springboot中使用redis的时候,建议将redisTemplate的key的序列化方式改为stirng形式的,然后value的序列化方式都采用默认。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值