最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java使用軟引用實現(xiàn)緩存機制示例

 更新時間:2022年08月07日 09:17:03   作者:My2538772270  
這篇文章主要為大家介紹了java使用軟引用實現(xiàn)緩存機制示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

“讀多寫少”是大部分項目的一個特點。例如“購物”,總是看的人多(讀)、買的人少(寫)。因此,如果能減少“讀”請求的次數(shù),就能減少服務(wù)端的壓力。最直接的減少“讀”請求次數(shù)的方法就是使用緩存。

軟引用和強引用

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

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

根據(jù)目前所學知識,我們可以使用 HashMap 在內(nèi)存級別實現(xiàn)緩存功能。

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

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

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

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

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

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

項目

使用idea創(chuàng)建一個maven項目

結(jié)構(gòu)如下

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

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

這里代碼省略。

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

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

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

然后書寫goodscache緩存類

這里我們需要接觸一個新關(guān)鍵字volatile

  • 使用volatile關(guān)鍵字會強制將修改的值立即寫入主存;
  • 使用volatile關(guān)鍵字的話,當主線程修改時,會導致RunThread的工作內(nèi)存中isRunning變量的緩存值變得無效。
  • 由于RunThread的工作內(nèi)存中緩存變量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;
    // 根據(jù)id存儲緩存Goods對象
    public void setCache(Goods goods) {
        cache.put(goods.getId(), new SoftReference<Goods>(goods));
        System.out.println("添加數(shù)據(jù)到緩存成功");
    }
    // 根據(jù)id從緩存中獲取對象
    public Goods getCache(String id) {
        // 根據(jù)id,獲取緩存對象的軟引用
        SoftReference<Goods> softRef = cache.get(id);
        return softRef == null ? null : softRef.get();
    }
    public void delCache(String id) {
        cache.remove(id);
        System.out.println("從緩存刪除數(shù)據(jù)成功");
    }
}

goodsservice模擬數(shù)據(jù)庫增刪改查

接下來我們書寫goodsservice代碼,來模擬數(shù)據(jù)庫增刪改查,不過我們是通過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("從數(shù)據(jù)庫讀取數(shù)據(jù)");
            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("添加數(shù)據(jù)到數(shù)據(jù)庫");
    }
    public void deleteById(String id){
        if(goodsCache.getCache(id) != null){
            goodsCache.delCache(id);
        }
        GoodsBase.getBase().remove(id);
    }
}

最后我們書寫test文件

運行結(jié)果

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

以上就是java使用軟引用實現(xiàn)緩存機制示例的詳細內(nèi)容,更多關(guān)于java軟引用緩存機制的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解決spring data redis的那些坑

    解決spring data redis的那些坑

    這篇文章主要介紹了spring data redis的那些坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • MyBatis 實現(xiàn)數(shù)據(jù)的批量新增和刪除的操作

    MyBatis 實現(xiàn)數(shù)據(jù)的批量新增和刪除的操作

    這篇文章主要介紹了MyBatis 實現(xiàn)數(shù)據(jù)的批量新增和刪除的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java使用ExecutorService來停止線程服務(wù)

    Java使用ExecutorService來停止線程服務(wù)

    這篇文章主要介紹了Java使用ExecutorService來停止線程服務(wù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • Springboot基礎(chǔ)之RedisUtils工具類

    Springboot基礎(chǔ)之RedisUtils工具類

    本文來說下RedisUtils工具類,主要介紹了整合Redis、MyBatis,封裝RedisUtils工具類等知識,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Spring?Security如何為用戶示例添加角色詳解

    Spring?Security如何為用戶示例添加角色詳解

    目前我正在用Java開發(fā)一個基于Spring Boot的web應(yīng)用程序,下面這篇文章主要給大家介紹了關(guān)于Spring?Security如何為用戶示例添加角色的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Spring Boot  Excel文件導出下載實現(xiàn)代碼

    Spring Boot Excel文件導出下載實現(xiàn)代碼

    這篇文章帶領(lǐng)我們直接實現(xiàn)Excel文件的直接導出下載,后續(xù)開發(fā)不需要開發(fā)很多代碼,直接繼承已經(jīng)寫好的代碼,增加一個Xml配置就可以直接導出。具體實現(xiàn)代碼大家跟隨小編一起通過本文學習吧
    2018-11-11
  • java基礎(chǔ)之NIO介紹及使用

    java基礎(chǔ)之NIO介紹及使用

    這篇文章主要介紹了java基礎(chǔ)之NIO介紹及使用,文中有非常詳細的代碼示例,對正在學習java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • PowerJob的OhMyClassLoader工作流程源碼解讀

    PowerJob的OhMyClassLoader工作流程源碼解讀

    這篇文章主要介紹了PowerJob的OhMyClassLoader工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Java編程異常簡單代碼示例

    Java編程異常簡單代碼示例

    這篇文章主要介紹了Java編程異常簡單代碼示例,還是比較不錯的,這里分享個大家,需要的朋友可以參考下。
    2017-11-11
  • Java開發(fā)如何把數(shù)據(jù)庫里的未付款訂單改成已付款

    Java開發(fā)如何把數(shù)據(jù)庫里的未付款訂單改成已付款

    這篇文章主要介紹了Java開發(fā)如何把數(shù)據(jù)庫里的未付款訂單改成已付款,先介紹MD5算法,簡單的來說,MD5能把任意大小、長度的數(shù)據(jù)轉(zhuǎn)換成固定長度的一串字符,實現(xiàn)思路非常簡單需要的朋友可以參考下
    2022-11-11

最新評論

卫辉市| 棋牌| 华宁县| 绿春县| 惠来县| 繁昌县| 门源| 峨边| 曲沃县| 开鲁县| 洛隆县| 天祝| 万安县| 仙游县| 墨玉县| 牙克石市| 民乐县| 临西县| 永嘉县| 铜山县| 上虞市| 伊金霍洛旗| 准格尔旗| 缙云县| 太和县| 乾安县| 阳信县| 三穗县| 梁山县| 瑞安市| 花莲县| 习水县| 汉源县| 福建省| 库伦旗| 茂名市| 南和县| 高要市| 宁都县| 阳江市| 大石桥市|