最近比较闲,阅读了一些开源项目,受到一些启发,于是萌生了自己开发一款轻量级的缓存框架的想法。目前业界成熟的缓存系统很多,如分布式缓存系统redis、memcache,本地缓存系统如guava cache、oscache、ehcache等,都有自己的适用场景及优缺点,多的不做评论(都是开源产品,自然是十分成熟和优秀的了)!cache2j这个名字是项目开发完成后,作者本人取的,本意是“cache to java”!
cache2j
是一款超级轻量的进程内缓存框架,基于java语言实现,底层存储基于ConcurrentHashMap
,核心功能包括:
1、提供了基于K,V形式的对象存储/查询能力;
2、支持多种类型的缓存淘汰策略,包括基于ttl(过期时间)方式和cap(容量)方式,默认基于ttl,根据写入时间FIFO淘汰;
3、提供了缓存监听器供用户实现并注册(缓存被淘汰时会回调监听器的callback
方法);
4、支持缓存过期自动加载/更新机制(实现CacheLoader
);
5、支持缓存命中率相关统计(cacheBuilder.stats()
);
guava cache
底层所用的是拓展的
HashTable
,和
ConcurrentHashMap
十分相似,通过引入一个
Segment
数组,对
HashTable
进行分段,通过分离锁、
final
以及
volatile
的配合,实现了并发环境下的线程安全;缺点:底层实现采用的是jdk1.8以前
ConcurrentHashMap
的实现,性能没有得到优化。
cache2j
底层采用
jdk
自带的
ConcurrentHashMap
;底层设计跟着
jdk
版本走,性能上可以得到优化(1.8版本以后取消了锁分段技术并引入了红黑树,性能得到极大的优化)。
2、淘汰策略实现guava cache
并未引入任何独立线程执行缓存“清理”工作,而是在读写的时候“顺便”做了部分清理工作。cache2j
如果设置了Monitor
(执行淘汰任务的工作线程),则由一个守护线程定期负责清理工作;如果未指定任何Monitor
,则在put
操作时完成少部分的清理工作。
整体而言,cache2j
无论从性能和使用灵活性上都十分不错!
public static void main(String[] args) throws Exception{
Cache<String,Object> cache = CacheBuilder.newBuilder()
.listener(new DefaultListener())//设置监听器
.factor(0.1) //设置缓存淘汰因子(Cap类型时有效)
.interval(1000) //执行淘汰的工作线程执行的频率,单位ms
.ttl(5000) //缓存的过期时间,单位ms
.maximum(20) //最大缓存数量
.monitor(MonitorType.TTL) //淘汰策略设置
.build(new CacheLoader<String,Object>(){
@Override //CacheLoader设置
public Object load(String key) {
return key+"-aaaa";
}
});
for(int i=0;i<30;i++){
cache.put("key"+i,"value"+i);
Thread.sleep(200);
}
Thread.sleep(6000);
System.out.println(cache.get("java"));
}
PS:cache2j是本人基于业余兴趣开发,设计上参考了业界优秀开源产品的特点,代码一直在更新,目前并未做任何压力测试(未来会补充),请勿做商业用途,仅供学习交流参考!欢迎大家批评指正,共同学习,谢谢支持!
后续文章我会逐步分享cache2j的设计实现。
转载请声明出处!