记一次由于remoteCache类型不兼容修改导致的异常问题

背景

进行Redis缓存升级改造, 缓存访问层统一进行了修改:
修改前代码如下, 按照Java原生序列化方式:

// 写缓存, Long类型
cache.put("key", 123L);
// 读缓存, Long类型
(Long)cache.get("key");

修改后代码如下, 统一按照String类型进行序列化/反序列化:

// 写缓存, 转成String类型
cache.put("key", "123");
// 读缓存, 获取String类型
(String)cache.get("key");

问题

线上发布过程中报出异常, ClassCastException, Long类型无法被cast成String类型.
经分析, 由于是集群的环境, 发布过程中, 针对同一个”key”,

  • 未布机器写入的还是Long类型
  • 已发布的机器读取该”key”对应的value, 尝试强转成String,
    反之亦然, 也会有 String类型无法被cast成Long类型的报错.

总结

在分布式环境下, 对remote cache的修改, 一定要注意兼容性:

  • 不止新版本旧版本的兼容性
  • 更要考虑到发布过程中新老机器, 针对同一个key的类型的兼容性.