记录 spring Cacheable 使用过程中遇到的一个坑
记录 spring Cacheable 使用过程中遇到的一个坑
@Override
@Cacheable(cacheNames="Cname",key="#key")
public <T> T getSysConfigObject(String key, Class<T> clazz) {
String value = 从数据库获取一个json配置字符串;
return 返回一个配置对象,对象中有多个属性;
}
正常情况下, 从数据库获取json字符串转换为对象,存入缓存,下次使用的时候直接从缓存获取,不再调用数据库查询。
之前也是能正常使用的。 忽然有一天,测试环境报错,调查发现该配置对象的一个 属性值 始终返回null,但是查看数据库该json显然是有值的。
本地调试,最终 是 cacheable 使用 redis 作为缓存数据库, redis 通过 Kryo 将对象序列化后存入 redis 数据库。
然后在获取时反序列化后转换为目标对象。但是这时该对象加了一个参数,导致反序列化出现偏差,使得其中一个参数变成null了。
核心代码:

问题原因: redis 对象缓存 序列化 和 反序列化 时 属性不一致导致 出现意外结果。
解决: 清空缓存,保证 数据库json字符串和 对象属性一致,且应保持对象序列化和反序列化时一致。
浙公网安备 33010602011771号