前言

  • 由于前期工作的失误(主要是黄sir的RedisConfi没有添加hash的序列化方式,所以用的jdk默认序列化)Redis存储格式如下。
    2025-02-08T01:56:00.png

在相同系统中,用redisTemplate直接取出没有问题。但是,由于业务的要求,需要通过redis管道来加快读取速度。
加快读取速度的必要性:

  • 用redisTemplate每次读取耗时40毫秒,若取200条数据,那就需要等8秒的时间
  • 频繁地建立拦截查询数据会造成大量不必要的资源浪费

问题出现

数据取出后始终携带乱码前缀。
2025-02-08T02:00:18.png
思路:
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);

还得是大哥

最后修改:2025 年 02 月 08 日
感恩的心,感谢有你!