Ehcache对并发的支持
在高并发的情况下,使用Ehcache缓存时,由于并发的读与写,我们读的数据有可能是错误的,我们写的数据也有可能意外的被覆盖。所幸的是Ehcache为我们提供了针对于缓存元素Key的Read(读)、Write(写)锁。当一个线程获取了某一Key的Read锁之后,其它线程获取针对于同一个Key的Read锁不会受到限制,但其它线程(包括获取了该Key的Read锁的线程)如果想获取针对同一个Key的Write锁就不行,它需要等到针对于该Key的Read锁释放后才能获取其Write锁;当一个线程获取了某一Key的Write锁之后,其它线程获取同一个Key的Read锁或者Write锁的请求将等待针对于该Key的Write锁释放后才能继续进行,但是同一个线程获取该Key对应的Read锁或者Write锁将不需要等待。获取了对应的锁之后,记得在不再需要该锁后释放该锁。并且需要注意不要引起死锁。
在Ehcache接口中为我们定义了几个与Read、Write锁相关的方法,具体方法如下所示: public interface Ehcache { /** * 获取给定Key的Read锁 * @param key */ public void acquireReadLockOnKey(Object key); /** * 获取给定Key的Write锁 * @param key */ public void acquireWriteLockOnKey(Object key); /** * 尝试着获取给定Key的Read锁,如果在给定timeout时间内还没有获取到对应的Read锁,则返回false,否则返回true。 * @param key * @param timeout 超时时间,单位是毫秒 * @return表示是否获取到了对应的Read锁 * @throws InterruptedException */ public boolean tryReadLockOnKey(Object key, long timeout) throws InterruptedException; /** * 尝试着获取给定Key的Write锁,如果在给定timeout时间内还没有获取到对应的Write锁,则返回false,否则返回true。 * @param key * @param timeout 超时时间,单位是毫秒 * @return表示是否获取到了对应的Write锁 * @throws InterruptedException */ public boolean tryWriteLockOnKey(Object key, long timeout) throws InterruptedException; /** * 释放所持有的给定Key的Read锁 * @param key */ public void releaseReadLockOnKey(Object key); /** * 释放所持有的给定Key的Write锁 * @param key */ public void releaseWriteLockOnKey(Object key); }
我们常用的Cache类已经为我们实现了这些方法,我们可以直接在程序中进行使用。以下是直接在程序中使用锁的一个简单示例。
@Test public void test() { CacheManager cacheManager = CacheManager.create(); cacheManager.addCache("test"); Cache cache = cacheManager.getCache("test"); final String key = "abc"; cache.acquireWriteLockOnKey(key); try { cache.put(new Element(key, "123")); } finally { System.out.println(cache.get(key)); cache.releaseWriteLockOnKey(key); } }
记得需要在合适的时候释放所获取的锁。
(注:本文是基于ehcache2.8.1所写)
相关推荐
跟博客中的高并发缓存器对应的代码,主要是基于ehcache进行代码整合,同时容器附带一些更新器的功能
NULL 博文链接:https://snowolf.iteye.com/blog/728877
1.解压缩到目录下,复制ehcache-monitor-kit-1.0.0\lib\ehcache-probe-1.0.0.jar包到application的web-inf/lib目录下 2.将以下配置copy的ehcache.xml文件的ehcache标签中,注:上述链接中说的配置少写了个probe包名...
本工程用于研究如何借助Ehcache缓存框架实现对页面的缓存 本工程编码方式:UTF-8 本工程开发工具:MyEclipse 说明: 1、ehcache.xml和ehcache.xsd两个文件可以在下在下载下来的名为“ehcache-core-x.x.x-...
NULL 博文链接:https://qiuqiu0034.iteye.com/blog/1162952
赠送jar包:ehcache-3.9.9.jar; 赠送原API文档:ehcache-3.9.9-javadoc.jar; 赠送源代码:ehcache-3.9.9-sources.jar; 赠送Maven依赖信息文件:ehcache-3.9.9.pom; 包含翻译后的API文档:ehcache-3.9.9-javadoc-...
mybatis添加ehcache缓存支持,基于maven项目管理
hibernate+ehcache hibernate+ehcache hibernate+ehcache hibernate+ehcache hibernate+ehcache
ehcache-3.8.1.jar
它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个 gzip 缓存 servlet 过滤器,支持 REST 和 SOAP api 等特点。 优点: 1)快速 2)简单 3)多种缓存策略 4)缓存数据有两级:内存和磁盘...
具有集群支持的 Ehcache 3(ehcache-clustered-3.8.1-kit.zip)
它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。 Ehcache最初是由Greg Luck于2003年开始开发。2009年,该项目被Terracotta购买。软件仍然是开源,...
hibernate ehcache.xml 配置详解
ehcache所需jar包 cglib-nodep-2.2.jar ehcache-core-2.5.2.jar ehcache-spring-annotations-1.2.0.jar guava-13.0.1.jar ehcache-terracotta-2.5.2.jar slf4j-api-1.6.1.jar slf4j-log4j12-1.6.1.jar terracotta-...
赠送jar包:ehcache-3.3.1.jar; 赠送原API文档:ehcache-3.3.1-javadoc.jar; 赠送源代码:ehcache-3.3.1-sources.jar; 赠送Maven依赖信息文件:ehcache-3.3.1.pom; 包含翻译后的API文档:ehcache-3.3.1-javadoc-...
软件介绍: 已测试有效的ehcache.xsd文件,引入ide中,进行ehcache.xml的代码提示。Windows外壳公用DLL文件,大小23.1KB。
ehcache所需的ehcache-core-2.5.2.jar及其源码ehcache-core-2.5.2-sources.jar
EhCache
spring3整合EhCache注解实例
ehcache-core-2.6.10.jar依赖包 MyBatiesEhCache二级缓存 Ehcache是一种广泛使用的开源Java分布式...它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点