这里分享一个java系统快速搭建缓存系统的一点经验,只需要15分钟时间,按部就班就可以搭建一个小而灵活的缓存系统。可以根据自己的业务复杂性再进行扩展。
最近做一个小项目,需要灵活配置,场景是这样的:很多系统会往当前项目推送一些日志信息,这些信息可能级别很高(可能是错误级别的)但是又是可以接受的所以不会发出警报给系统负责人,而随着日志越来越多,也发现更多的可以忽略的信息,因此配置一个可过滤的映射表,只要包含这些关键字的日志信息均会过滤掉不再通知系统负责人。
问题:过滤的关键字是可配置的,即使在系统运行时也可以通过修改或者添加新的过滤条件到数据库,并要求该系统可以加载读取新的过滤条件集合。
解决方案:采用缓存方式,但是因为项目较小,功能单一业务量也不大,所以使用Spring的@Scheduler注解来做一个定时任务,定时查询数据库的数据,并根据结果集刷新需要过滤的关键字列表。
xmlns:task="http://www.springframework.org/schema/task
模式地址:
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd
如下所示:
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;
}
}
for( String str : KeyFilterConditionCache.getFilter()){
if( content.contains(str) ){
logger.info(headFlag + "过滤关键字,匹配关键字:" + str);
return ;
}
}
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);
}
}
是不是很简洁,赶紧试试吧…