cache2j:持久化机制实现

版权声明:请勿作为商业用途!未经博主允许请勿转载!谢谢支持! https://blog.csdn.net/u012737673/article/details/81303083

作为内存缓存框架,持久化能力并非其关键特性,目前cache2j支持的持久化机制是“定时全量快照备份”的形式,类似redis的rdb持久化机制,优点是如果有数据备份的需求,则机器重启后数据恢复的速度较快,且性能较好(相比于AOF形式);缺点是最后一次快照备份可能会发生数据丢失的风险。

cache2j持久化机制的实现主要依赖的桥梁就是内部的MessageQueue,其底层实现是基于jdk自带的无界非阻塞队列ConcurrentLinkedQueue,并且是线程安全的。

当内存数据有变动的时候,会同步写到队列中一条变动日志,格式如:{"operation":"INSERT","key":"aaa","value":"bbb"}。后台线程会每隔一定时间处理队列中的操作日志,并将处理后得到的快照数据持久化到文件中。

当系统重启时,缓存初始化过程中会先从文件中恢复数据到内存。

private void initCache(CacheBuilder<? super K, ? super V> builder) {
        if (builder.getListener() != null) {
            listeners.add(builder.getListener());
        }

        if (builder.getEnableFlushDisk()) {
            if (null == builder.getPath()) {
                throw new UnCheckNullException("dump path may be not null");
            }

            this.queue = new MessageQueue();
            this.flushDiskProcessor = newProcessor(builder.getProcessorType().type());

            Map bak = LoadProcessor.read(builder.getPath());
            if (null != bak && !bak.isEmpty()) {
                loading(bak);
            }
        }

        this.monitor = builder.getType() == null ? null : newInstance(builder.getType().getType());
    }

    private void loading(Map bak) {
        Set<K> keys = bak.keySet();
        for (K key : keys) {
            doPut(key, (V) bak.get(key));
        }
    }

资源地址

Github地址

项目wiki地址

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

转载请声明出处!

contact me:[email protected]

猜你喜欢

转载自blog.csdn.net/u012737673/article/details/81303083