Object v = cache.getIfPresent(id);
if (!(v instanceof User)) {
cache.invalidate(id);
return loadFromDb(id);
}
发版后订单查询接口报 ClassCastException: LinkedHashMap cannot be cast to User,重启前十分钟正常,之后开始零星 500。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:新版本把本地缓存的值从 Java 对象改成 Jackson 序列化的 Map,进程里还留着旧版本写入的对象。读取处直接强转成 User,类型不匹配就抛异常。
「本地缓存序列化变更」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。同一份配置存在多处的,先确认改的是被加载的那一份。
新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
处理上按这个顺序:发版时清一次本地缓存 或者给缓存加结构版本前缀;读取处判断类型 不匹配就删除并回源;滚动发布期间新旧实例不要共用同一份持久化缓存。
确认没问题再收工,灰度两台新实例后不再出现 ClassCastException,旧对象被识别后自动回源,接口错误率回到 0。
