解析springboot整合谷歌開源緩存框架Guava Cache原理
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項(xiàng)目長時(shí)間不進(jìn)行接口操作,提示HikariPool-1警告的解決
這篇文章主要介紹了Springboot項(xiàng)目長時(shí)間不進(jìn)行接口操作,提示HikariPool-1警告的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12SpringBoot項(xiàng)目修改訪問端口和訪問路徑的方法
這篇文章主要介紹了SpringBoot項(xiàng)目修改訪問端口和訪問路徑的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12Java中print、printf、println的區(qū)別
這篇文章主要介紹了Java中print、printf、println的區(qū)別的相關(guān)資料,需要的朋友可以參考下2023-03-03SpringBoot后端接收數(shù)組對象的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot后端接收數(shù)組對象的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11