当前位置: 首页 > 后端技术 > Java

SpringBoot在集成CaffeineCache时,遇到获取到的缓存对象和原来设置的对象不一样的问题

时间:2023-04-01 23:03:51 Java

背??景在使用本地缓存Caffeine的时候遇到了一个问题。代码逻辑大致如下。先尝试从本地缓存中根据Key获取Apple对象,如果不行就初始化一个名为“小花生”的苹果放到Caffeine的本地缓存中,但是放入之后我又对这个对象做了一个设置,改了名字从“小花生”改成了“凌夜君”,但是目前我是直接返回了对象,并没有第二次把这个对象放到缓存中。那么你觉得苹果对象的名字在此时的缓存是“小花生”?今天出现的问题是缓存中Apple对象的Name不再是“小花生”,而是变成了“凌夜君”。privateApplegetAppleByCaffeineCache(){StringcacheKey="lingyejun.cache.apple";Appleapple=(Apple)cache.getIfPresent(cacheKey);if(Objects.isNull(apple)){apple=newApple();apple.setName("小花生");cache.put(cacheKey,apple);}apple.setName("凌夜君");returnapple;都存在于缓存框架管理的一个类中,我们缓存的数据作为这个类的一个属性。当我们试图从缓存中获取我们需要的值时,我们调用这个类的一个get方法。这个类持有对我们存储的数据的引用,对我们需要从缓存中获取的数据的引用。当我们通过引用修改数据时,我们修改了引用指向的实际数据本身。所以,我们修改了从缓存中获取的数据后,实际存储在缓存中的数据也被修改了,我们再次从缓存中取出,得到的就是修改后的数据。解决方案如果我们在方法中取出缓存对象后需要对这个对象做下一步的逻辑处理,那么我们可以将这个对象复制到一个新的对象中,对这个新对象的操作不会影响到我们在.cache中的缓存对象。如果本文对您有帮助,请给“凌夜君”点个赞,谢谢支持。