前言
- 由于前期工作的失误(主要是黄sir的RedisConfi没有添加hash的序列化方式,所以用的jdk默认序列化)Redis存储格式如下。
在相同系统中,用redisTemplate直接取出没有问题。但是,由于业务的要求,需要通过redis管道来加快读取速度。
加快读取速度的必要性:
- 用redisTemplate每次读取耗时40毫秒,若取200条数据,那就需要等8秒的时间
- 频繁地建立拦截查询数据会造成大量不必要的资源浪费
问题出现
数据取出后始终携带乱码前缀。
思路:
redis中的数据是JdkSerializationRedisSerializer序列化的,错误采用string类型反序列化就会如此。
若先用StringRedisSerializer再次序列化,然后用JdkSerializationRedisSerializer反序列化说不定能解决
结果:
失败,猜测错误使用StringRedisSerializer反序列化过程中已经损坏了数据结构。
解决方案
redisTemplate管道本来就有指定序列化
JdkSerializationRedisSerializer serializer = new JdkSerializationRedisSerializer();
List<String> resultList = redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
// 重新插入新的元素
for (Long siteId : siteIdList) {
for (String point : pointList) {
// hashKey 使用jdk的序列化方式
connection.hGet((CacheConstant.EMS_SITE_POINT_VALUE + siteId).getBytes(), Objects.requireNonNull(serializer.serialize(point)));
}
}
return null;
}, serializer);
还得是大哥
4 条评论
新车上路,只带前10个人
文章紧扣主题,观点鲜明,展现出深刻的思考维度。
结论部分可提出实际应用建议,提升价值。
作者的观点新颖且实用,让人在阅读中获得了新的思考和灵感。