1. 程式人生 > 其它 >Spring Boot整合Caffeine Cache時遇到獲取到的快取物件和當初設定的物件不同的問題

Spring Boot整合Caffeine Cache時遇到獲取到的快取物件和當初設定的物件不同的問題

背景

在使用本地快取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

  

作者:翎野君
出處:http://www.cnblogs.com/lingyejun/
若本文如對您有幫助,不妨點選一下右下角的【推薦】。
如果您喜歡或希望看到更多我的文章,可掃描二維碼關注我的微信公眾號《翎驛》。
轉載文章請務必保留出處和署名,否則保留追究法律責任的權利。