前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >15分钟搭建一个简单的Java缓存系统

15分钟搭建一个简单的Java缓存系统

作者头像
青山师
发布2023-05-04 20:28:55
1870
发布2023-05-04 20:28:55
举报
文章被收录于专栏:IT当时语_青山师_JAVA技术栈

这里分享一个java系统快速搭建缓存系统的一点经验,只需要15分钟时间,按部就班就可以搭建一个小而灵活的缓存系统。可以根据自己的业务复杂性再进行扩展。

最近做一个小项目,需要灵活配置,场景是这样的:很多系统会往当前项目推送一些日志信息,这些信息可能级别很高(可能是错误级别的)但是又是可以接受的所以不会发出警报给系统负责人,而随着日志越来越多,也发现更多的可以忽略的信息,因此配置一个可过滤的映射表,只要包含这些关键字的日志信息均会过滤掉不再通知系统负责人。

问题:过滤的关键字是可配置的,即使在系统运行时也可以通过修改或者添加新的过滤条件到数据库,并要求该系统可以加载读取新的过滤条件集合。

解决方案:采用缓存方式,但是因为项目较小,功能单一业务量也不大,所以使用Spring的@Scheduler注解来做一个定时任务,定时查询数据库的数据,并根据结果集刷新需要过滤的关键字列表。

  • 我使用了一个静态列表(KeyFilterConditionCache 类的keyList)来保存需要过滤的关键字。
  • 定时任务(RefreshKeyFilterCache 类的refreshKeyFilter方法)负责定时(这里设置每隔5分钟)查询最新的关键字表,并把结果刷新到静态列表。
  • 业务类会使用最新的关键字列表去匹配收到的日志内容

第一步 首先引入spring的task命名空间

代码语言:javascript
复制
xmlns:task="http://www.springframework.org/schema/task

模式地址:

代码语言:javascript
复制
http://www.springframework.org/schema/task 
            http://www.springframework.org/schema/task/spring-task.xsd

如下所示:

这里写图片描述
这里写图片描述

第二步 编写缓存数据库表中关键字的服务类

代码语言:javascript
复制
package org.byron4j.ynyn.service;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;

import lombok.Getter;
import lombok.Setter;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import org.byron4j.ynyn.mapper.YnynLoggerKeyFilterMapper;
import org.byron4j.ynyn.mode.YnynLoggerKeyFilter;



@Service
public class KeyFilterConditionCache {

    @Autowired
    private YnynLoggerKeyFilterMapper ynynLoggerKeyFilterMapper;

    /**
    *@Getter @Setter是lombok的注解,简单实用可以参考http://blog.csdn.net/zixiao217/article/category/6302134
    */
    private @Getter @Setter static List<YnynLoggerKeyFilter> keyList;

    /**
    * @PostConstruct注解,表示该bean初始化以及属性注入完之后会调用该方法
    * 这里我们使用该方法第一次读取数据库的原始关键字配置
    */
    @PostConstruct
    public void init(){
        YnynLoggerKeyFilter record= new YnynLoggerKeyFilter();
        keyList = ynynLoggerKeyFilterMapper.getYnynLoggerKeyFilterByChoose(record);
        System.out.println("关键字列表:" + keyList);
    }


    /**
    * 缓存服务类需要提供一个静态方法供其它业务类获取缓存配置的关键字列表
    */
    public static List<String> getFilter(){
        List<String> list = new ArrayList<String>();
        if( null !=  keyList ){
            for( YnynLoggerKeyFilter filter : keyList){
                list.add(filter.getKeyFilter());
            }
        }

        return list;

    }

}

第三步 调用数据库配置服务:

代码语言:javascript
复制
for( String str : KeyFilterConditionCache.getFilter()){
                    if( content.contains(str) ){
                        logger.info(headFlag + "过滤关键字,匹配关键字:" + str);
                        return ;
                    }
                }

第四步 编写一个每隔5分钟刷新数据库配置缓存的定时任务:

代码语言:javascript
复制
package byron4j.ynyn.job;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

import byron4j.ynyn.mapper.YnynLoggerKeyFilterMapper;
import byron4j.ynyn.mode.YnynLoggerKeyFilter;
import byron4j.ynyn.service.KeyFilterConditionCache;

/**
* Spring会将该类作为一个任务类
*/
@Configuration
@EnableScheduling
public class RefreshKeyFilterCache {

    @Autowired
    private YnynLoggerKeyFilterMapper ynynLoggerKeyFilterMapper;

    /**
    *Spring会将该方法作为一个job,scheduler注解作为触发器"点火"时间
    */
    @Scheduled(cron="0 0/5 * * * ?")
    public void refreshKeyFilter(){
        YnynLoggerKeyFilter record= new YnynLoggerKeyFilter();
        List<YnynLoggerKeyFilter> keyList = ynynLoggerKeyFilterMapper.getYnynLoggerKeyFilterByChoose(record);
        System.out.println("日志信息匹配关键字过滤--缓存刷新:" + keyList);
        KeyFilterConditionCache.setKeyList(keyList);
    }
}

是不是很简洁,赶紧试试吧…

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一步 首先引入spring的task命名空间
  • 第二步 编写缓存数据库表中关键字的服务类
  • 第三步 调用数据库配置服务:
  • 第四步 编写一个每隔5分钟刷新数据库配置缓存的定时任务:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档