欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解析springboot整合谷歌開源緩存框架Guava Cache原理

 更新時(shí)間:2021年08月17日 17:33:43   作者:sjgeng111  
本文主要為大家解析了springboot整合谷歌開源緩存框架Guava Cache的原理以及在實(shí)際開發(fā)過程中的使用,附含源碼,有需要的朋友可以參考下

Guava Cache:⾕歌開源緩存框架

Guava Cache是在內(nèi)存中緩存數(shù)據(jù),相比較于數(shù)據(jù)庫或redis存儲,訪問內(nèi)存中的數(shù)據(jù)會更加高效。Guava官網(wǎng)介紹,下面的這幾種情況可以考慮使用Guava Cache:

愿意消耗一些內(nèi)存空間來提升速度。

預(yù)料到某些鍵會被多次查詢。

緩存中存放的數(shù)據(jù)總量不會超出內(nèi)存容量。

github地址:https://github.com/google/guava/wiki/CachesExplained

在這里插入圖片描述

全內(nèi)存的本地緩存實(shí)現(xiàn),查詢數(shù)據(jù)時(shí)先根據(jù)自定義索引判斷Guava Cache中是否存在該數(shù)據(jù),如果存在就從Guava Cache中取,不存在就從數(shù)據(jù)庫中查詢,再保存到Guava Cache中,減少數(shù)據(jù)庫查詢的壓力

⾼性能且功能豐富

線程安全,操作簡單 (底層實(shí)現(xiàn)機(jī)制類似ConcurrentMap)

Guava Cache使用

  •  添加依賴
 <!--guava依賴包-->
 <dependency>
 <groupId>com.google.guava</groupId>
 <artifactId>guava</artifactId>
 <version>19.0</version>
 </dependency>
  • 封裝api工具類:
@Component
public class BaseCache {
    private Cache<String,Object> tenMinuteCache = CacheBuilder.newBuilder()
            //設(shè)置緩存初始大小,應(yīng)該合理設(shè)置,后續(xù)會擴(kuò)容
            .initialCapacity(10)
            //最大值
            .maximumSize(100)
            //并發(fā)數(shù)設(shè)置
            .concurrencyLevel(5)
            //緩存過期時(shí)間,寫入后10分鐘過期
            .expireAfterWrite(600,TimeUnit.SECONDS)
            //統(tǒng)計(jì)緩存命中率
            .recordStats()
            .build();

    private Cache<String,Object> oneHourCache = CacheBuilder.newBuilder()
            //設(shè)置緩存初始大小,應(yīng)該合理設(shè)置,后續(xù)會擴(kuò)容
            .initialCapacity(30)
            //最大值
            .maximumSize(100)
            //并發(fā)數(shù)設(shè)置
            .concurrencyLevel(5)
            //緩存過期時(shí)間,寫入后1小時(shí) 過期
            .expireAfterWrite(3600,TimeUnit.SECONDS)
            //統(tǒng)計(jì)緩存命中率
            .recordStats()
            .build();


    public Cache<String, Object> getOneHourCache() {
        return oneHourCache;
    }
    public void setOneHourCache(Cache<String, Object> oneHourCache) {
        this.oneHourCache = oneHourCache;
    }
    public Cache<String, Object> getTenMinuteCache() {
        return tenMinuteCache;
    }
    public void setTenMinuteCache(Cache<String, Object> tenMinuteCache) {
        this.tenMinuteCache = tenMinuteCache;
    }
}
  • 實(shí)際開發(fā)中使用:(查詢數(shù)據(jù)時(shí)先根據(jù)自定義索引判斷Guava Cache中是否存在該數(shù)據(jù),如果存在就從Guava Cache中取,不存在就從數(shù)據(jù)庫中查詢,再保存到Guava Cache中)

自定義索引:

/**
 * 緩存key管理類
 */
public class CacheKeyManager {

    /**
     * 首頁輪播圖緩存key
     */
    public static final String INDEX_BANNER_KEY = "index:banner:list";

    /**
     * 首頁視頻列表緩存key
     */
    public static final String INDEX_VIDEL_LIST = "index:video:list";

    /**
     * 視頻詳情緩存key, %s是視頻id
     */
    public static final String VIDEO_DETAIL = "video:detail:%s";

}

如果存在就從Guava Cache中取,不存在就從數(shù)據(jù)庫中查詢,再保存到Guava Cache中

@Service
public class VideoServiceImpl implements VideoService {

    @Autowired
    private VideoMapper videoMapper;
    @Autowired
    private BaseCache baseCache;
    @Override
    public List<Video> listVideo() {
        try{
          Object cacheObj =  baseCache.getTenMinuteCache().get(CacheKeyManager.INDEX_VIDEL_LIST,()->{
                List<Video> videoList = videoMapper.listVideo();
                return videoList;
            });
          if(cacheObj instanceof List){
              List<Video> videoList = (List<Video>)cacheObj;
              return videoList;
          }
        }catch (Exception e){
            e.printStackTrace();
        }
        //可以返回兜底數(shù)據(jù),業(yè)務(wù)系統(tǒng)降級-》SpringCloud專題課程
        return null;
    }

    @Override
    publc List<VideoBanner> listBanner() {
        try{
            Object cacheObj =  baseCache.getTenMinuteCache().get(CacheKeyManager.INDEX_BANNER_KEY, ()->{
                List<VideoBanner> bannerList =  videoMapper.listVideoBanner();
                System.out.println("從數(shù)據(jù)庫里面找輪播圖列表");
                return bannerList;
            });
            if(cacheObj instanceof List){
                List<VideoBanner> bannerList = (List<VideoBanner>)cacheObj;
                return bannerList;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public Video findDetailById(int videoId) {
        //單獨(dú)構(gòu)建一個緩存key,每個視頻的key是不一樣的
        String videoCacheKey = String.format(CacheKeyManager.VIDEO_DETAIL,videoId);
        try{
         Object cacheObject = baseCache.getOneHourCache().get( videoCacheKey, ()->{
                // 需要使用mybaits關(guān)聯(lián)復(fù)雜查詢
                Video video = videoMapper.findDetailById(videoId);
                return video;
            });

         if(cacheObject instanceof Video){
             Video video = (Video)cacheObject;
             return video;
         }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}

使用壓測⼯具Jmeter5.x進(jìn)行接口壓力測試:

壓測⼯具本地快速安裝Jmeter5.x

簡介:GUI圖形界⾯的安裝 Jmeter5.x

需要安裝JDK8 以上

建議安裝JDK環(huán)境,雖然JRE也可以,但是壓測https需要JDK⾥⾯的 keytool⼯具

快速下載:https://jmeter.apache.org/download_jmeter.cgi

⽂檔地址:http://jmeter.apache.org/usermanual/get-started.html

在這里插入圖片描述

解jmeter解壓⽂件⾥⾯的各個⽬錄:

bin:核⼼可執(zhí)⾏⽂件,包含配置
jmeter.bat: windows啟動⽂件(window系統(tǒng)⼀定要配置顯示⽂件拓展名)
jmeter: mac或者linux啟動⽂件
jmeter-server:mac或者Liunx分布式壓測使⽤的啟動⽂件
jmeter-server.bat:window分布式壓測使⽤的啟動⽂件
jmeter.properties: 核⼼配置⽂件
extras:插件拓展的包
lib:核⼼的依賴包

Jmeter語⾔版本中英⽂切換

控制臺修改 menu -> options -> choose language

配置⽂件修改

bin⽬錄 -> jmeter.properties

默認(rèn) #language=en

改為 language=zh_CN

在這里插入圖片描述

新增聚合報(bào)告:線程組->添加->監(jiān)聽器->聚合報(bào)告(Aggregate Report)

在這里插入圖片描述 

在這里插入圖片描述 

在這里插入圖片描述 

在這里插入圖片描述

在這里插入圖片描述 

在這里插入圖片描述

lable: sampler的名稱
Samples: ⼀共發(fā)出去多少請求,例如10個⽤戶,循環(huán)10次,則是 100
Average: 平均響應(yīng)時(shí)間
Median: 中位數(shù),也就是 50% ⽤戶的響應(yīng)時(shí)間
90% Line : 90% ⽤戶的響應(yīng)不會超過該時(shí)間 (90% of the samples took no more than
this time. The remaining samples at least as long as this)
95% Line : 95% ⽤戶的響應(yīng)不會超過該時(shí)間
99% Line : 99% ⽤戶的響應(yīng)不會超過該時(shí)間
min : 最⼩響應(yīng)時(shí)間
max : 最⼤響應(yīng)時(shí)間
Error%:錯誤的請求的數(shù)量/請求的總數(shù)
Throughput: 吞吐量——默認(rèn)情況下表示每秒完成的請求數(shù)(Request per Second) 可類⽐為
qps、tps
KB/Sec: 每秒接收數(shù)據(jù)量

啟⽤緩存 壓測熱點(diǎn)數(shù)據(jù)接接⼝Throughput: 14000:

在這里插入圖片描述 

在這里插入圖片描述

不啟⽤緩存 壓測熱點(diǎn)數(shù)據(jù)接⼝

視頻輪播圖接⼝ Throughput : 2700

在這里插入圖片描述 

在這里插入圖片描述

當(dāng)數(shù)據(jù)訪問量較大時(shí),比如主頁信息等,可以考慮使用Guava Cache,可以將程序頻繁用到的少量數(shù)據(jù)存儲到Guava Cache中,以改善程序性能!

到此這篇關(guān)于解析springboot整合谷歌開源緩存框架Guava Cache原理的文章就介紹到這了,更多相關(guān)框架整合內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談springboot自動裝配原理

    淺談springboot自動裝配原理

    作為Spring Boot的精髓,自動配置原理首當(dāng)其沖.今天就帶大家了解一下springboot自動裝配的原理,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • java隨機(jī)字符補(bǔ)充版

    java隨機(jī)字符補(bǔ)充版

    今天在zuidaimai看到一個java隨機(jī)字符生成demo,正好要用,但發(fā)現(xiàn)不完整,重新整理一下,分享給有需要的朋友
    2014-01-01
  • java多線程導(dǎo)入excel的方法

    java多線程導(dǎo)入excel的方法

    最近項(xiàng)目寫了poi導(dǎo)入excel數(shù)據(jù)到數(shù)據(jù)庫,想把學(xué)到的知識用于實(shí)踐,于是使用多線程方式導(dǎo)入excel,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 我賭你不清楚Spring中關(guān)于Null的這些事

    我賭你不清楚Spring中關(guān)于Null的這些事

    這篇文章主要介紹了我賭你不清楚Spring中關(guān)于Null的這些事,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Java實(shí)現(xiàn)JDBC批量插入原理詳解

    Java實(shí)現(xiàn)JDBC批量插入原理詳解

    在JDBC中,executeBatch這個方法可以將多條dml語句批量執(zhí)行,效率比單條執(zhí)行executeUpdate高很多,這是什么原理呢?在mysql和oracle中又是如何實(shí)現(xiàn)批量執(zhí)行的呢?本文將給大家介紹這背后的原理
    2023-03-03
  • Springboot項(xiàng)目長時(shí)間不進(jìn)行接口操作,提示HikariPool-1警告的解決

    Springboot項(xiàng)目長時(shí)間不進(jìn)行接口操作,提示HikariPool-1警告的解決

    這篇文章主要介紹了Springboot項(xiàng)目長時(shí)間不進(jìn)行接口操作,提示HikariPool-1警告的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • SpringBoot項(xiàng)目修改訪問端口和訪問路徑的方法

    SpringBoot項(xiàng)目修改訪問端口和訪問路徑的方法

    這篇文章主要介紹了SpringBoot項(xiàng)目修改訪問端口和訪問路徑的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Java中print、printf、println的區(qū)別

    Java中print、printf、println的區(qū)別

    這篇文章主要介紹了Java中print、printf、println的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • SpringBoot后端接收數(shù)組對象的實(shí)現(xiàn)

    SpringBoot后端接收數(shù)組對象的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot后端接收數(shù)組對象的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • SpringBoot整合Minio的示例代碼

    SpringBoot整合Minio的示例代碼

    這篇文章主要介紹了SpringBoot整合Minio的示例代碼,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12

最新評論