博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ehcache2拾遗之write和load
阅读量:6316 次
发布时间:2019-06-22

本文共 2797 字,大约阅读时间需要 9 分钟。

问题描述

在cache系统中writeThrough和writeBehind是两个常用的模式。

writeThrough是指,当用户更新缓存时,自动将值写入到数据源。
writeBehind是指,在用户更新缓存后异步更新到数据源。

ehcache实现

ehcache内部有一个接口,这个接口实现了cache一系列生命周期的钩子函数。

只需要实现自定义的写贯穿方法就可以在更新缓存时将对象写入底层的数据源

//自定义的CacheWriter    public class MyCacheWriter implements CacheWriter {        public void write(Element element) throws CacheException {            System.out.println("write->"+element.getObjectValue());    //write到数据层        }        public void writeAll(Collection elements) throws CacheException {            System.out.println("writeall");           //write到数据层        }        ...    }    //cacheWriter的工厂方法    public class MyCacheWriterFactory extends CacheWriterFactory{        @Override        public CacheWriter createCacheWriter(Ehcache cache, Properties properties) {            return new MyCacheWriter();    //返回自定义的CacheWriter        }

再将writer(的工厂方法)配置到cache中

可以看到CacheWrite关于write有两个方法,write和writeall,这是通过配置中的writeMode控制的当配置为write-through时会在每一次更新缓存时同步调用write方法。而如果设置为write-behind时则会根据maxWriteDelay调用writeall来讲这段时间的数据调用writeall。

ehcahce的自动load机制

常规的cache使用方法是

if(cache.exist("key")){        return cache.get("exist");    }else{        value=dao.get("key");        cache.put("key",value);        return value;    }

是在检测cache没有命中时从dao获得数据再跟新到缓存。

有以下两种办法可以减少这种复杂的编码

SelfPopulatingCache

在ehcache中有一套SelfPopulatingCache机制,它可以在缓存miss的情况下load底层数据

//cache load工厂    public class MyCacheEntryFactory implements CacheEntryFactory {        public Object createEntry(Object key) throws Exception {            return new String("autoload "+key);    //自定义load方法        }    }    //cache的装饰者工厂类    public class MyCacheDecoratorFactory extends CacheDecoratorFactory{        @Override        public Ehcache createDecoratedEhcache(Ehcache cache, Properties properties) {            return new SelfPopulatingCache(cache, new MyCacheEntryFactory());//使用SelfPopulatingCache并注册MyCacheEntryFactory         }

并在cache配置文件cache层中配置

这样获得的cache就会是经过装饰工厂生成的cache了

SelfPopulatingCache继承了BlockingCache,使用读写锁进行多线程更新和读取cache内容。
下面展示一下调用的代码

@Test    public void readWriteThroughCache() throws InterruptedException {        CacheManager cache = CacheManager.create("cache.xml");        Ehcache readWriteCache = cache.addCacheIfAbsent("writerCache");        System.out.println("unexist key->"+readWriteCache.get(2).getObjectValue());    //自动读取值        readWriteCache.putWithWriter(new Element(1, "value"));                         //写贯穿a需调用putWithWriter        cache.shutdown();    }

输出为

unexist key->autoload 2    write->value

使用getWithLoader

cache类拥有getWithLoader方法,它可以调用传入的loader对象进行数据load。但需要将get都改成这个方,而且对多线程同时写数据没有进行阻塞。

小结

以上介绍了ehcahe中write-thtough,write-behind与load-read的实现,可以在使用中适当选择数据加载及写入方式

转载于:https://www.cnblogs.com/resentment/p/5792534.html

你可能感兴趣的文章
Hadoop日记Day1---Hadoop介绍
查看>>
Android学习笔记——文件路径(/mnt/sdcard/...)、Uri(content://media/external/...)学习
查看>>
Echart:前端很好的数据图表展现工具+demo
查看>>
Linux VNC黑屏(转)
查看>>
Java反射简介
查看>>
day8--socket网络编程进阶
查看>>
node mysql模块写入中文字符时的乱码问题
查看>>
分析Ajax爬取今日头条街拍美图
查看>>
内存分布简视图
查看>>
如何学习虚拟现实技术vr? vr初级入门教程开始
查看>>
第4 章序列的应用
查看>>
初识闭包
查看>>
hdu1874畅通工程续
查看>>
rails 字符串 转化为 html
查看>>
AOP动态代理
查看>>
Yii2.0 下的 load() 方法的使用
查看>>
华为畅玩5 (CUN-AL00) 刷入第三方twrp Recovery 及 root
查看>>
[转] ReactNative Animated动画详解
查看>>
DNS原理及其解析过程
查看>>
没想到cnblog也有月经贴,其实C#值不值钱不重要。
查看>>