小白入职记(一):基于spring的简单配置缓存

作为一个刚毕业的实习期职场小白,初进公司,才发现公司的项目与大学布置的项目作业完全不一样,无论是技术的深度还是交付所需考虑的情况,都不可相提并论。因此,打算写个系列博客,总结一些学到的知识点,也顺便记录下职场生活,不管是对自己的技术水平还是文笔,想想也是没有坏处的吧。
公司的项目里面很多地方都用到了配置项,比如将下拉框的选项配置进数据库中,使用的时候异步请求数据库来返回具体的下拉选项。我在做项目中的某个查询功能的时候,需要对传入的下拉选项在后端做校验,若每次请求都需要校验该项是否为数据库中的配置,就会多次查询数据库,这样的话无论是对性能还是服务器的压力总归是不太好的。于是我请教了同事,同事告诉我可以将配置信息存在内存缓存中,这样每次开启服务器的时候,一次查询,一直使用。

  1. 先定义配置项的封装类
/**
 * 用于存放需要缓存的配置信息
 * 可以缓存任何你需要缓存的数据类型
 * 可以在一个类似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;
    }
}
  1. 创建缓存工厂
/**
 * 配置项缓存工厂
 */
@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;
    }
  1. 测试访问缓存
    //自动注入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,欢迎小伙伴加我交流,我们共同进步~

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Getting Started Burp Suite 是用于攻击web 应用程序的集成平台。它包含了许多工具,并为...
    Eva_chenx阅读 28,940评论 0 14
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,494评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,167评论 1 32
  • 上午老公早早上班走了,给孩子办身份证的事该我接手了,收拾完叫儿子起床去派出所办证,他说要睡觉,困,我见状也不去叫了...
    杨建新wang阅读 104评论 0 0
  • 今天是六一儿童节,是个欢乐的日子。不免都要缅怀我们的那时候,这也提醒各位为人父母者,我们曾经都是孩子。那不禁问,你...
    多丽码字阅读 209评论 0 2