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

解析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存儲(chǔ),訪問內(nèi)存中的數(shù)據(jù)會(huì)更加高效。Guava官網(wǎng)介紹,下面的這幾種情況可以考慮使用Guava Cache:

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

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

緩存中存放的數(shù)據(jù)總量不會(huì)超出內(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ù)會(huì)擴(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ù)會(huì)擴(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)建一個(gè)緩存key,每個(gè)視頻的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解壓⽂件⾥⾯的各個(gè)⽬錄:

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

Jmeter語⾔版本中英⽂切換

控制臺(tái)修改 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個(gè)⽤戶,循環(huán)10次,則是 100
Average: 平均響應(yīng)時(shí)間
Median: 中位數(shù),也就是 50% ⽤戶的響應(yīng)時(shí)間
90% Line : 90% ⽤戶的響應(yīng)不會(huì)超過該時(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)不會(huì)超過該時(shí)間
99% Line : 99% ⽤戶的響應(yīng)不會(huì)超過該時(shí)間
min : 最⼩響應(yīng)時(shí)間
max : 最⼤響應(yīng)時(shí)間
Error%:錯(cuò)誤的請求的數(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ù)存儲(chǔ)到Guava Cache中,以改善程序性能!

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

相關(guān)文章

  • 關(guān)于Springboot中JSCH的使用及說明

    關(guān)于Springboot中JSCH的使用及說明

    這篇文章主要介紹了關(guān)于Springboot中JSCH的使用及說明,具有很好的參考價(jià)值,希望對大家有所幫助。
    2022-09-09
  • Java中通過反射實(shí)現(xiàn)代理Proxy代碼實(shí)例

    Java中通過反射實(shí)現(xiàn)代理Proxy代碼實(shí)例

    這篇文章主要介紹了Java中通過反射實(shí)現(xiàn)代理Proxy代碼實(shí)例,java實(shí)現(xiàn)代理可以通過java.lang.reflect.Proxy接口結(jié)合java.lang.reflect.InvocationHandler來實(shí)現(xiàn),需要的朋友可以參考下
    2023-08-08
  • Java學(xué)習(xí)筆記之觀察者模式

    Java學(xué)習(xí)筆記之觀察者模式

    這篇文章主要為大家詳細(xì)介紹了Java學(xué)習(xí)筆記之觀察者模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 深入了解java-jwt生成與校驗(yàn)

    深入了解java-jwt生成與校驗(yàn)

    這篇文章主要介紹了深入了解java-jwt生成與校驗(yàn),Json web token(JWT)是為了網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開發(fā)標(biāo)準(zhǔn)(RFC 7519),該token被設(shè)計(jì)為緊湊且安全的,特別適用于分布式站點(diǎn)的單點(diǎn)登陸(SSO)場景。,需要的朋友可以參考下
    2019-06-06
  • 基于SpringBoot和Vue3的博客平臺(tái)發(fā)布、編輯、刪除文章功能實(shí)現(xiàn)

    基于SpringBoot和Vue3的博客平臺(tái)發(fā)布、編輯、刪除文章功能實(shí)現(xiàn)

    在上一個(gè)教程中,我們已經(jīng)實(shí)現(xiàn)了基于Spring?Boot和Vue3的用戶注冊與登錄功能。本教程將繼續(xù)引導(dǎo)您實(shí)現(xiàn)博客平臺(tái)的發(fā)布、編輯、刪除文章功能,需要的朋友參考一下
    2023-04-04
  • 詳解Java中的三種流程控制語句

    詳解Java中的三種流程控制語句

    這篇文章主要介紹了Java中常用的三種流程控制語句的使用,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2022-04-04
  • 詳解關(guān)于spring bean名稱命名的那些事

    詳解關(guān)于spring bean名稱命名的那些事

    每個(gè)bean都有一個(gè)或者多個(gè)標(biāo)識(shí)符,這些標(biāo)識(shí)符在容器中必須是唯一的,這篇文章主要給大家介紹了關(guān)于spring bean名稱命名的那些事,需要的朋友可以參考下
    2021-07-07
  • Java指令重排在多線程環(huán)境下的解決方式

    Java指令重排在多線程環(huán)境下的解決方式

    這篇文章介紹了Java指令重排在多線程環(huán)境下的解決方式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • 基于Spring AOP proxyTargetClass的行為表現(xiàn)總結(jié)

    基于Spring AOP proxyTargetClass的行為表現(xiàn)總結(jié)

    這篇文章主要介紹了Spring AOP proxyTargetClass的行為表現(xiàn)總結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring事物的傳播特性詳解

    Spring事物的傳播特性詳解

    這篇文章主要介紹了Spring事物的傳播性詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05

最新評論

望城县| 南投市| 东明县| 惠来县| 富顺县| 武安市| 久治县| 丁青县| 沈丘县| 儋州市| 沈丘县| 呼图壁县| 兴和县| 呼图壁县| 临安市| 卢龙县| 抚顺县| 彭山县| 务川| 平塘县| 高邑县| 龙口市| 民乐县| 城步| 达拉特旗| 成都市| 水富县| 乳源| 淮阳县| 沂南县| 松江区| 曲阜市| 清新县| 天峨县| 青田县| 株洲市| 玛曲县| 确山县| 赤水市| 四川省| 北川|