亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java如何使用軟引用實現緩存機制

發布時間:2022-08-08 11:48:12 來源:億速云 閱讀:149 作者:iii 欄目:開發技術

這篇文章主要介紹了java如何使用軟引用實現緩存機制的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇java如何使用軟引用實現緩存機制文章都會有所收獲,下面我們一起來看看吧。

軟引用和強引用

對于同一個讀請求,只需要在第一次訪問時從數據庫中查詢數據,并將查詢到的數據保存到緩存中,之后的查詢請求就可以直接在緩存中獲取,從而減少對數據庫的訪問次數。

這種情況我們生活種經常會看到,比如訪問某app某商品,第一次進去會加載一會會,后面繼續點擊是直接出現。

java如何使用軟引用實現緩存機制

根據目前所學知識,我們可以使用 HashMap 在內存級別實現緩存功能。

例如,可以使用一個 HashMap 對象保存客戶端第一次請求的結果,之后,當客戶端再次發起讀請求時,就從 HashMap 對象中遍歷查詢,如果 HashMap 中已經保存過客戶要查詢的數據,就直接返回,否則再向數據庫發起查詢請求,并將查詢結果保存到 HashMap 中。

這種緩存的設計思路十分簡單,但也存在一個問題:HashMap 中緩存的數據何時被清空?

內存容量是有限制的,如果永無止盡的向 HashMap 緩存數據,顯然會對內存容量帶來壓力。一種解決方案就是使用 JVM 提供的軟引用,實現對 HashMap 中緩存數據的淘汰策略。

開發中最常使用的是強引用,例如 Goods goods = new Goods() 就創建了一個強引用對象“goods”。只要強引用的作用域沒有結束,或者沒有被開發者手工設置為 null,那么強引用對象會始終存在于 JVM 內存中。

而 JVM 提供的軟引用就比較靈活:當 JVM 的內存足夠時,GC 對待軟引用和強引用的方式是一樣的;但當 JVM 的內存不足時,GC 就會去主動回收軟引用對象。

可見,非常適合將緩存的對象存放在軟引用中。軟引用需要借助 JDK 提供的 java.lang.ref.SoftReference 類來實現。

項目

使用idea創建一個maven項目

結構如下

java如何使用軟引用實現緩存機制

首先對Good實體類進行編寫。

要求,goods有屬性id,name并書寫他的getset方法,以及有參無參構造器。

這里代碼省略。

然后我們在goodbase里面編寫代碼,模擬一個數據庫

里面主要有hashmap,并且通過get方法,得到該hashmap

public class GoodsBase {
    private static Map<String, Goods> base = new HashMap<>();
    public static Map<String, Goods> getBase() {
        return base;
    }
}

然后書寫goodscache緩存類

這里我們需要接觸一個新關鍵字volatile

  • 使用volatile關鍵字會強制將修改的值立即寫入主存;

  • 使用volatile關鍵字的話,當主線程修改時,會導致RunThread的工作內存中isRunning變量的緩存值變得無效。

  • 由于RunThread的工作內存中緩存變量isRunning緩存無效,所以會再次從主存中讀取isRunning變量值。

在map里面通過泛型把緩存對象存儲在軟引用里面(map里面)

代碼如下:

public class GoodsCache {
    private volatile static GoodsCache goodsCache;
    public GoodsCache(){
        this.cache = new HashMap<>();
    }
    public static GoodsCache getGoodsCache() {
        if(goodsCache == null) {
            synchronized (GoodsCache.class){
                if(goodsCache == null){
                    goodsCache = new GoodsCache();
                }
            }
        }
        return goodsCache;
    }
    // 將緩存對象存儲在軟引用中
    private Map<String, SoftReference<Goods>> cache;
    // 根據id存儲緩存Goods對象
    public void setCache(Goods goods) {
        cache.put(goods.getId(), new SoftReference<Goods>(goods));
        System.out.println("添加數據到緩存成功");
    }
    // 根據id從緩存中獲取對象
    public Goods getCache(String id) {
        // 根據id,獲取緩存對象的軟引用
        SoftReference<Goods> softRef = cache.get(id);
        return softRef == null ? null : softRef.get();
    }
    public void delCache(String id) {
        cache.remove(id);
        System.out.println("從緩存刪除數據成功");
    }
}

goodsservice模擬數據庫增刪改查

接下來我們書寫goodsservice代碼,來模擬數據庫增刪改查,不過我們是通過id來進行

public class GoodsService {
    GoodsCache goodsCache = GoodsCache.getGoodsCache();
    public Goods getById(String id){
        if(goodsCache.getCache(id) == null){
            Goods goods = GoodsBase.getBase().get(id);
            goodsCache.setCache(goods);
            System.out.println("從數據庫讀取數據");
            System.out.println(goods.getName());
            return goods;
        }
        System.out.println(goodsCache.getCache(id).getName());
        return goodsCache.getCache(id);
    }
    public void add(Goods goods){
        goodsCache.setCache(goods);
        GoodsBase.getBase().put(goods.getId(), goods);
        System.out.println("添加數據到數據庫");
    }
    public void deleteById(String id){
        if(goodsCache.getCache(id) != null){
            goodsCache.delCache(id);
        }
        GoodsBase.getBase().remove(id);
    }
}

最后我們書寫test文件

java如何使用軟引用實現緩存機制

運行結果

java如何使用軟引用實現緩存機制

可以看到第二次運行 goodsService.getById("1"); 是從緩存中直接讀取的數據,也可以看出,其實用軟引用實現緩存機制,讀取的對象是同一個對象。

關于“java如何使用軟引用實現緩存機制”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“java如何使用軟引用實現緩存機制”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

通海县| 大洼县| 海兴县| 塘沽区| 东山县| 许昌市| 万全县| 德江县| 永泰县| 佛坪县| 韩城市| 扶绥县| 连城县| 洛南县| 晋中市| 闽侯县| 万盛区| 临西县| 开化县| 台湾省| 密云县| 平原县| 义马市| 铜鼓县| 鹤壁市| 睢宁县| 东海县| 扎赉特旗| 长海县| 河间市| 宕昌县| 桑日县| 醴陵市| 江山市| 临朐县| 揭阳市| 安泽县| 牟定县| 乾安县| 孝昌县| 水富县|