首页 > 数据库 >记一次Redis报错问题

记一次Redis报错问题

时间:2024-03-21 19:55:05浏览次数:22  
标签:一次 Redis 报错 UnmodifiableMap GenericJackson2JsonRedisSerializer 序列化 构造函数

问题描述

Spring项目中使用了@Cacheable注解并且将缓存放入redis,当从Redis读取缓存时提示了反序列化异常,无法构造UnmodifiableMap,没有默认的构造函数

Could not read JSON: Cannot construct instance of `org.apache.commons.collections4.map.UnmodifiableMap` (no Creators, like default constructor, exist): no default constructor found

排查过程

  1. 关闭@Cacheable注解,发现代码能够正常运行,所以代码没有问题,问题在于Redis

  2. 搭建本地Spring项目并还原场景,测试问题是否在于注解导致的缓存对应类的构造函数冲突:@Builder @NoArgsConstructor @AllArgsConstructor, 发现与注解无关,排除

  3. 由于报错信息在于序列化问题,所以分别去掉implements SerializableserialVersionUID, 发现去掉序列化实现会报错, 而去掉serialVersionUID代码仍然可以运行,后得知是JVM会自动计算生成

  4. 在排查序列化问题时,发现虽然两个项目都是序列化异常,但是报错信息却不一样,点开本地项目报错的stackTrace最后一条是 JdkSerializationRedisSerializer.deserialize,而原项目却是
    GenericJackson2JsonRedisSerializer.deserialize,由此发现两个项目序列化器不同

  5. 在本地项目中自定义cacheManager,并使用GenericJackson2JsonRedisSerializer作为序列化器,运行后果不其然报了一样的错误,所以问题在于序列化器

  6. 学习了解GenericJackson2JsonRedisSerializer的工作过程,大致为以下几步:

    1. 读取 JSON 数据
    2. 解析 JSON 数据
    3. 构造对象实例
    4. 处理类型信息
    5. 返回反序列化的对象
  7. 到此才理解为什么报错信息说没有默认构造函数,是因为在反序列化时会构造对象实例,而UnmodifiableMap是没有默认构造函数的

结论

Redis序列化器GenericJackson2JsonRedisSerializer读取数据时需要实例化对象,UnmodifiableMap没有构造函数,所以会报错。

解决办法

使用其他构造器,例如默认的JdkSerializationRedisSerializer

标签:一次,Redis,报错,UnmodifiableMap,GenericJackson2JsonRedisSerializer,序列化,构造函数
From: https://www.cnblogs.com/Hypnoz-/p/18088135

相关文章

  • redis——集合,有序,慢查询, pipline与事务, bitmap ,HyperLogLog geo
    集合类型(set)saddkeyelement#向集合key添加element(如果element存在,添加失败)o(1)sremkeyelement#从集合中的element移除掉o(1)scardkey#计算集合大小sismemberkeyelement#判断element是否在集合中srandmemberkeycount#从集合中随机取出count个元素,不会破坏集......
  • hive 插入(insert)数据报错 解决办法
    异常信息:org.apache.hive.service.cli.HiveSQLException:Errorwhileprocessingstatement:FAILED:ExecutionError,returncode2fromorg.apache.hadoop.hive.ql.exec.mr.MapRedTask我的问题是:可以创建表,可以删除表,可以给表导入数据,可以查询数据,但是不能使用insert插入数......
  • golang使用redis锁(避免误解锁/死锁/过期引起并发):go-redis, redigo
    【go-redis】简单实现方式,不会死锁/误解锁packagemainimport("context""fmt""sync""time"redis2"github.com/redis/go-redis/v9")varmutexsync.Mutex//redis加锁sec:锁定秒数(避免死锁),value锁唯一值(避免误解......
  • 分布式锁中的王者方案 - Redission
    文章目录5.1分布式锁-redission功能介绍5.2分布式锁-Redission快速入门5.3分布式锁-redission可重入锁原理5.4分布式锁-redission锁重试和WatchDog机制5.5分布式锁-redission锁的MutiLock原理5.1分布式锁-redission功能介绍基于setnx实现的分布式锁存在......
  • requests.post传的data如果是直接使用python dict封装,有些服务端接收不了这种数据类型
    平时在自己的php项目里,使用dict方式组装data,然后requests.post,一点问题都没有。但是调了后端一个java的微服务接口,结果就一直报错422: 最后问了一下开发,得到提示“python好像还有个毛病,python的json对象转字符串的时候,转出来的字符串不是标准json字符串,还要做个字符串处理,变成......
  • 解决SpringBoot环境下Redis哨兵模式连接失败问题,“NOAUTH Authentication required”
    io.lettuce.core.RedisCommandExceptionException:“NOAUTHAuthenticationrequired”在某行工作,项目上线代码,uat环境无异常,上到pp环境有问题,报redis连接不上;观察配置,发觉是apollo的配置是哨兵模式,有个哨兵密码。spring2.2.6RELEASE版本问题。于是写了全局配置,读取配置中......
  • 询问ChatGPT4,改造TodoList:把本地存储的localStorage修改成PHP+Redis
    这里照搬的是:免费极简设计网页版Todo  https://www.ricocc.com/todo/非常感谢原作者Rico。我很喜欢这个设计和风格,但是可惜只能本地存储,我又不想使用微软的TODO,登录倒无所谓,但是数据同步问题很大,实在头痛,所以放弃。我是菜鸟,只是刚好前段时间安装了Apache、PHP的一键安装包和......
  • Xcode开发iOS运行项目报错symbol(s) not found for architecture x86_64的解决办法
    写在前边的话:如果是xcode13,那么请先升级系统到Monterey(ios12.7.4),并安装xcode14。因为好多sdk都是xcode14才有的,xcode13不支持,任你把buildsetting玩出花来都没用的。Xcode13的时候,各种报错百度搜索解决方法,各种配置buildsettings,然而没有什么用,真机/模拟器都是一一直报错。......
  • debian11 网卡报错carrier-changed
    起因今天中午12点多公司某台拥有双网卡(内网和外网)的debian11操作系统的机器内网IP地址发生了变化,经过询问都说没有人动过这台机器的IP地址。这让我感到十分疑惑,没有人改动怎么IP地址怎么还会变化呢?背景这台Debian11的操作系统拥有两张网卡,一张外网网卡,一张内网网卡。由于公......
  • Redisson-RTopic
    RTpoic简介:RTpoic是Redisson提供的用于实现发布-订阅(Pub/Sub)模式的类,它封装了 Redis 的发布和订阅功能,让开发者能够轻松地在分布式环境中进行消息的发布和订阅。实际上类似于Kafka、RocketMQ等一系列MessageQueue的生产-消费关系。自产自销:简单的说,可以实现一个服务中,自己......