作為一個剛畢業(yè)的實習(xí)期職場小白,初進公司翘县,才發(fā)現(xiàn)公司的項目與大學(xué)布置的項目作業(yè)完全不一樣最域,無論是技術(shù)的深度還是交付所需考慮的情況,都不可相提并論锈麸。因此镀脂,打算寫個系列博客,總結(jié)一些學(xué)到的知識點忘伞,也順便記錄下職場生活薄翅,不管是對自己的技術(shù)水平還是文筆,想想也是沒有壞處的吧氓奈。
公司的項目里面很多地方都用到了配置項翘魄,比如將下拉框的選項配置進數(shù)據(jù)庫中,使用的時候異步請求數(shù)據(jù)庫來返回具體的下拉選項舀奶。我在做項目中的某個查詢功能的時候暑竟,需要對傳入的下拉選項在后端做校驗,若每次請求都需要校驗該項是否為數(shù)據(jù)庫中的配置育勺,就會多次查詢數(shù)據(jù)庫但荤,這樣的話無論是對性能還是服務(wù)器的壓力總歸是不太好的罗岖。于是我請教了同事,同事告訴我可以將配置信息存在內(nèi)存緩存中腹躁,這樣每次開啟服務(wù)器的時候桑包,一次查詢,一直使用纺非。
- 先定義配置項的封裝類
/**
* 用于存放需要緩存的配置信息
* 可以緩存任何你需要緩存的數(shù)據(jù)類型
* 可以在一個類似ResourceCacheInfo的類中封裝多種配置項
* 也可以將不同配置項封裝在一個或多個類似ResourceCacheInfo的類中
*/
public class ResourceCacheInfo {
/**
* 下拉框選項
* 例1:用于存放下拉框的選項集合
*/
private List<Map<String,String>> selectItems;
//
/**
* 項目基礎(chǔ)配置項
* 例2:用于存放全局配置信息項
*/
private List<Map<String,String>> configInfo;
public List<Map<String, String>> getSelectItems() {
return selectItems;
}
public void setSelectItems(List<Map<String, String>> selectItems) {
this.selectItems = selectItems;
}
public List<Map<String, String>> getConfigInfo() {
return configInfo;
}
public void setConfigInfo(List<Map<String, String>> configInfo) {
this.configInfo = configInfo;
}
}
- 創(chuàng)建緩存工廠
/**
* 配置項緩存工廠
*/
@Component
public class ResourceCacheFactory {
//日志
private static Logger Log = Logger.getLogger(ResourceCacheFactory.class);
/**
* 使用@bean注解可以在執(zhí)行完該方法后哑了,在其他地方可以注入并使用
*
* @return
*/
@Bean
public ResourceCacheInfo getCache() {
Log.info("開始加載緩存");
ResourceCacheInfo cache = new ResourceCacheInfo();
Log.info("加載下拉框緩存");
//模擬查詢數(shù)據(jù)庫
cache.setSelectItems(getSelectItemFromDB());
Log.info("加載配置項緩存");
//獲取公共配置項
cache.setConfigInfo(getConfigInforomDB());
return cache;
}
- 測試訪問緩存
//自動注入bean
@Autowired
private ResourceCacheInfo cache;
@GetMapping("/cache")
public ResourceCacheInfo getCache() {
Log.info("下拉框緩存內(nèi)容:"+cache.getSelectItems());
Log.info("配置項緩存內(nèi)容:"+cache.getConfigInfo());
return cache;
}
可以看到在服務(wù)器啟動的時候,已經(jīng)開始查詢并添加進緩存
12:11:20,056 INFO ResourceCacheFactory:31 - 開始加載緩存
12:11:20,057 INFO ResourceCacheFactory:33 - 加載下拉框緩存
12:11:20,058 INFO ResourceCacheFactory:36 - 加載配置項緩存
2019-11-10 12:11:20.209 INFO 14356 --- [ restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2019-11-10 12:11:20.338 INFO 14356 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
2019-11-10 12:11:20.376 INFO 14356 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8180 (http) with context path ''
2019-11-10 12:11:20.378 INFO 14356 --- [ restartedMain] com.example.demo.DemoApplication : Started DemoApplication in 4.391 seconds (JVM running for 15.558)
測試訪問緩存地址http://localhost:8180/cache
12:14:09,377 INFO CacheRes:19 - 下拉框緩存內(nèi)容:[{下拉選項一=下拉選項一}, {下拉選項二=下拉選項二}, {下拉選項三=下拉選項三}]
12:14:09,378 INFO CacheRes:20 - 配置項緩存內(nèi)容:[{MAX_IMAGE_UPLOAD_LENGTH=3}, {REQUEST_TIME_OUT=20000}, {ALLOW_HTTPS_LOGIN=1}]
可以看到緩存已經(jīng)成功獲取到了铐炫,這下其它地方需要引用的話垒手,就使用
@Autowired
private ResourceCacheInfo cache;
即可獲取,不需要重復(fù)查詢數(shù)據(jù)庫倒信,增加訪問速度,也可以減輕服務(wù)器的壓力泳梆。
但還有不完善的地方:
- 由于是服務(wù)器一次啟動則讀取緩存鳖悠,若配置項發(fā)生變動,理論上只有重啟才能刷新緩存优妙,正常情況下項目是部署在生產(chǎn)服務(wù)器上的乘综,不可能隨時重啟,因此還需要在緩存工廠中新增一個刷新緩存的方法套硼,實現(xiàn)不重啟服務(wù)器即可刷新緩存的功能卡辰。
- 這種緩存方式只是最簡單,最容易實現(xiàn)的方式邪意,spring還有自帶的緩存注解等九妈,還需要考慮的有很多。
作為一個萌新雾鬼,非常希望大家給我一點建議或指出我的不足萌朱,我一定虛心接受,若能讓其它小伙伴得到一點點幫助或啟發(fā)策菜,我會感到非常開心的(●'?'●)
這是這個demo的github地址:https://github.com/yuanbwhub/cache-demo和我的qq1252615137晶疼,歡迎小伙伴加我交流,我們共同進步~