作为内存缓存框架,持久化能力并非其关键特性,目前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));
}
}
资源地址
PS:cache2j是本人基于业余兴趣开发,设计上参考了业界优秀开源产品的特点,代码一直在更新,目前并未做任何压力测试(未来会补充),请勿做商业用途,仅供学习交流参考!欢迎大家批评指正,共同学习,谢谢支持!
转载请声明出处!
contact me:1261608273@qq.com