背景
在使用本地缓存Caffeine时,遇到了一个问题,代码逻辑大致如下,先从本地缓存中根据Key尝试获取Apple对象,如果没有获取到的话,则初始化一个名为“小花生”的苹果并放到Caffeine的本地缓存中去。
但是放完了之后,我又对此对象进行了一个设置,把名字从“小花生”改成了“翎野君”,但是至此我直接返回对象,并没有再将这个对象第二次放到缓存中去。
那么你想想这个时候缓存中的这个Apple对象的name是“小花生”吗?今天出现的问题就是缓存中的Apple对象的Name不再是“小花生”,而是变成了“翎野君”。
private Apple getAppleByCaffeineCache() { String cacheKey = "lingyejun.cache.apple"; Apple apple = (Apple) cache.getIfPresent(cacheKey); if (Objects.isNull(apple)) { apple = new Apple(); apple.setName("小花生"); cache.put(cacheKey, apple); } apple.setName("翎野君"); return apple; }
原因
在网上搜索一下,所谓内存缓存,我们可以理解为我们缓存的数据都存在于一个缓存框架管理的类中,并且我们缓存的数据都作为了该类的一个属性。
当我们尝试从缓存中取我们需要的值时,就是调用了该类的一个 get 方法。该类持有的是我们存储的数据的引用,我们从缓存中拿到的所需数据的引用。我们通过引用,修改数据时,修改的都是引用指向的实际数据本身。
所以,我们修改了从缓存中取得的数据后,缓存中实际存储的数据也被修改了,我们再从缓存中取,取得的就是修改后的数据了。
办法
如果我们在方法中取出缓存对象后还需要针对这个对象做下一步的逻辑处理,那么可以将此对象再拷贝成一个新的对象,针对这个新的对象做操作就不会影响到我们的缓存中的对象了。
本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。
原文链接:https://www.cnblogs.com/lingyejun/p/15111145.html