标准答案
- 新增字段应提供默认值并保持旧读兼容,读取旧缓存时不能因为缺少新字段直接抛异常或返回半截对象。
- 发生不兼容的字段重命名、类型变化或序列化格式变更时,使用新的 Key 版本或显式 schema version,让新代码不再解析旧字节。
- 读取失败时应删除当前缓存值并回源重建,同时记录版本、Key 类型和失败原因,避免每次请求都重复触发反序列化错误。
- 迁移完成后按 TTL、扫描或发布窗口清理旧 Key;不要在无边界的全量脚本里直接改写所有线上缓存。
题目解析
缓存兼容和 API 兼容一样需要先扩展、再迁移、最后收缩。把缓存看成临时数据不代表可以忽略升级窗口,因为旧值可能在发布后继续存在数小时或更久。
语言特定对象序列化容易把类名、字段顺序和运行时版本绑定到缓存。跨服务数据更适合显式 schema、JSON 或可演进的二进制协议。
常见误区
- 改了对象字段后假设所有缓存会立刻失效。
- 捕获反序列化异常后继续返回空对象,掩盖数据错误。