当前位置: 首页 > 工具软件 > cache4j > 使用案例 >

Cache2j:一款轻量级的进程内缓存框架的实现

申高卓
2023-12-01

背景

最近比较闲,阅读了一些开源项目,受到一些启发,于是萌生了自己开发一款轻量级的缓存框架的想法。目前业界成熟的缓存系统很多,如分布式缓存系统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

1、底层实现:
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"));
    }


资源地址

Github地址

项目wiki地址

PS:cache2j是本人基于业余兴趣开发,设计上参考了业界优秀开源产品的特点,代码一直在更新,目前并未做任何压力测试(未来会补充),请勿做商业用途,仅供学习交流参考!欢迎大家批评指正,共同学习,谢谢支持!

后续文章我会逐步分享cache2j的设计实现。

转载请声明出处!

contact me: 1261608273@qq.com
 类似资料: