业务踩坑——本地缓存guava的坑_什么叫本地缓存
今天接到一个需求,现存接口需要加一个功能,对于不同来源的调用,需要做额外的实时处理;原有功能大致如下:
想要实现的效果如下图所示
基于开闭原则,直接在原有方法外部去基于来源处理返回的响应即可,但是处理后的第一次调用是正常的,第二次调用就出现很诡异的现象
从缓存中读取到了上一次调用处理过的对象数据,但是在我们并没有修改缓存读写的内部逻辑,仅仅是在外部对输出B,进行了一定的修改;
经过定位发现,本地缓存中,缓存的是输出B的引用,我们对输出B去做处理时,实际上也会修改本地缓存中B的值,因此,需要对输出B做深拷贝,然后再做处理;
有的小伙伴就要问了,为什么不对输入和来源的联合Key做缓存,这个确实是一个比较好的解决方案,但是对于后续处理函数要求实时处理的场景就不大适用;因为本次的业务修改中,需要对每次的访问都做实时处理,即响应B依赖于输入A,可以进行缓存,响应B'依赖于输入A和来源C,每次响应都需要实时处理,因此无法对这个结果进行缓存;