背景

在应用本地缓存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/lingy...