Java Cache详解及简单实现详解及简单实现
主要介绍了 Java Cache详解及简单实现的相关资料,需要的朋友可以参考下
Java Cache详解及简单实现详解及简单实现
概要:概要:
最近在做spring的项目,想做一个缓存,访问数据库,定期来做数据更新
要实现两个功能
1. 可以通过http请求来立刻刷新缓存
2. 缓存可以通过自己配置的时间间隔来定期刷新
通过通过Controller来做来做
因为需要通过http来刷新缓存,所以第一个想法就是把缓存做成一个Controller
Controller的实现
Controller最大的优势,就是可以通过Spring的配置,注入很多依赖,比如对Service的依赖,对数据库的依赖等。
大量的访问数据库跟服务层的代码,都可以进行复用
定义一个Cache接口如下:
public interface Cache {
/**
* Refresh the cache. If succeed, return true, else return false;
*
* @return
*/
boolean refresh();
/**
* How much time it will refresh the cache.
*
* @return
*/
long interval();
}
但是这里碰到了问题,自己写的Controller可以通过注入的方式轻而易举的与Http服务跟Service层,数据库层连接,但是如果
CacheController实现Cache接口,会发现很难调用interval函数来找到间隔的时间。
因为CacheController也是一个Bean,需要通过Spring找到这个bean来调用。无法找到Bean,就不能调用Interval,也就不能
够顺势通过另外的线程来控制缓存刷新。为了获取这个Bean可以将所有的CacheController都Autowired到一个
CacheManagerController之中
@Controller
public class CacheManagerController {
@Autowired
private CacheController cache;
private static ScheduledExecutorService executor = Executors
.newScheduledThreadPool(1);
public CacheManagerController() {
executor.scheduleAtFixedRate(() -> cache.refresh(), 0, cache.interval(),
TimeUnit.MILLISECONDS);
}
}
曾经考虑这么做,但是发现一个问题,这样做,CacheManagerController在初始化的时候,也就是构造Bean的时候,各种的
Cache还没有被注入CacheController,而如果不将方法放入构造函数,那么CacheManagerController是无法自动的调用调度
服务的。需要手动调用才行。但是程序的入口不一定从哪一个Controller进入,如果写拦截器,也是很繁琐,而且每次调用都
会执行。
这个时候,就通过一个CacheService来实现这个问题
public class CacheService {