小白入职记(一):基于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,欢迎小伙伴加我交流,我们共同进步~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

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