作为一个刚毕业的实习期职场小白,初进公司,才发现公司的项目与大学布置的项目作业完全不一样,无论是技术的深度还是交付所需考虑的情况,都不可相提并论。因此,打算写个系列博客,总结一些学到的知识点,也顺便记录下职场生活,不管是对自己的技术水平还是文笔,想想也是没有坏处的吧。
公司的项目里面很多地方都用到了配置项,比如将下拉框的选项配置进数据库中,使用的时候异步请求数据库来返回具体的下拉选项。我在做项目中的某个查询功能的时候,需要对传入的下拉选项在后端做校验,若每次请求都需要校验该项是否为数据库中的配置,就会多次查询数据库,这样的话无论是对性能还是服务器的压力总归是不太好的。于是我请教了同事,同事告诉我可以将配置信息存在内存缓存中,这样每次开启服务器的时候,一次查询,一直使用。
- 先定义配置项的封装类
/**
* 用于存放需要缓存的配置信息
* 可以缓存任何你需要缓存的数据类型
* 可以在一个类似ResourceCacheInfo的类中封装多种配置项
* 也可以将不同配置项封装在一个或多个类似ResourceCacheInfo的类中
*/
public class ResourceCacheInfo {
/**
* 下拉框选项
* 例1:用于存放下拉框的选项集合
*/
private List<Map<String,String>> selectItems;
//
/**
* 项目基础配置项
* 例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;
}
}
- 创建缓存工厂
/**
* 配置项缓存工厂
*/
@Component
public class ResourceCacheFactory {
//日志
private static Logger Log = Logger.getLogger(ResourceCacheFactory.class);
/**
* 使用@bean注解可以在执行完该方法后,在其他地方可以注入并使用
*
* @return
*/
@Bean
public ResourceCacheInfo getCache() {
Log.info("开始加载缓存");
ResourceCacheInfo cache = new ResourceCacheInfo();
Log.info("加载下拉框缓存");
//模拟查询数据库
cache.setSelectItems(getSelectItemFromDB());
Log.info("加载配置项缓存");
//获取公共配置项
cache.setConfigInfo(getConfigInforomDB());
return cache;
}
- 测试访问缓存
//自动注入bean
@Autowired
private ResourceCacheInfo cache;
@GetMapping("/cache")
public ResourceCacheInfo getCache() {
Log.info("下拉框缓存内容:"+cache.getSelectItems());
Log.info("配置项缓存内容:"+cache.getConfigInfo());
return cache;
}
可以看到在服务器启动的时候,已经开始查询并添加进缓存
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 - 下拉框缓存内容:[{下拉选项一=下拉选项一}, {下拉选项二=下拉选项二}, {下拉选项三=下拉选项三}]
12:14:09,378 INFO CacheRes:20 - 配置项缓存内容:[{MAX_IMAGE_UPLOAD_LENGTH=3}, {REQUEST_TIME_OUT=20000}, {ALLOW_HTTPS_LOGIN=1}]
可以看到缓存已经成功获取到了,这下其它地方需要引用的话,就使用
@Autowired
private ResourceCacheInfo cache;
即可获取,不需要重复查询数据库,增加访问速度,也可以减轻服务器的压力。
但还有不完善的地方:
- 由于是服务器一次启动则读取缓存,若配置项发生变动,理论上只有重启才能刷新缓存,正常情况下项目是部署在生产服务器上的,不可能随时重启,因此还需要在缓存工厂中新增一个刷新缓存的方法,实现不重启服务器即可刷新缓存的功能。
- 这种缓存方式只是最简单,最容易实现的方式,spring还有自带的缓存注解等,还需要考虑的有很多。
作为一个萌新,非常希望大家给我一点建议或指出我的不足,我一定虚心接受,若能让其它小伙伴得到一点点帮助或启发,我会感到非常开心的(●'◡'●)
这是这个demo的github地址:https://github.com/yuanbwhub/cache-demo和我的qq1252615137,欢迎小伙伴加我交流,我们共同进步~