转自:http://haohaoxuexi.iteye.com/blog/2119733
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所写)
相关推荐
它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一 个gzip缓存servlet过滤器,支持REST和SOAP api等特点。MapDB: mapdb是一个内嵌的纯java的数据库,提供了并发的HashMap、TreeMap、Queue,可以基 于...
Zblog是一个java实现的开源博客系统。 核心功能 文章/页面发布、分类、统计阅读次数。 提供文章形式的RSS聚合。 提供链接的添加、归类功能。...注:前台界面部分借鉴自Flat和并发编程网。 标签:Zblog
4系统是公司多个项目的基础框架,稳定性好,支持大并发。 开发工具和采用技术 1开发工具:Eclipse、MyEclipse和其他IDE。 2采用Spring 3中最新最稳定的Spring MVC 3.2.8版本。 3采用Hibernate 4.1.7。Spring MVC ...
l JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。 2.3.5. 配置二级缓存的主要步骤: 1) 选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略。这...
使用Spring+JPA+Velocity+Ehcache作为基础开发架构,应用SpringSecurity框架管理系统权限,结合URL重写技术静态化商城前台页面。 Shopping结合多年的电商开发经验及主流电商的功能特点,注重系统易用性、功能性、...
23.ehcache 自定义二级缓存 ,选择缓存存放目录,处理并发,增加系统性能 24.服务器内部GET POST 请求 25.uploadify 上传插件,单条、批量上传,带进度条,异步,图片、视频, 其它文件格式均可上传 26.地图选点获取...
23.ehcache 自定义二级缓存 ,选择缓存存放目录,处理并发,增加系统性能 24.服务器内部GET POST 请求 25.uploadify 上传插件,单条、批量上传,带进度条,异步,图片、视频, 其它文件格式均可上传 26.地图选点获取...
支持并发。 使用简单。 因为简单,所以通用,命中率稳定。 使用示例 // 配置 CacheConfig config = CacheConfig.custom().setMaxElement(10000); // 缓存元素个数上限 // 缓存节点工厂 INodeFactory<String> ...
Shopping结合多年的电商开发经验及主流电商的功能特点,注重系统易用性、功能性、扩展性,充分考虑大数据、大并发、系统安全、SEO功能,使得系统设计更加完善,更加高效稳定Shopping系统融合当前主流B2B2C、C2C购物...
在编程领域,缓存是不可或缺的一部分,从处理器到应用层,其...实际上,Caffeine与ConcurrentMap在功能上有许多相似之处,都支持并发操作,且数据的存取时间复杂度为O(1)。然而,二者在数据管理策略上存在显著差异:
4、系统是公司多个项目的基础框架,稳定性好,支持大并发。 二、主要功能 1、采用ExtJS 4.2.1.883无限制版本,放心用于网站开发。 2、ExtJS富文本编辑器增加修改信息。 3、ExtJS的HtmlEditor的图片文件上传插件。 ...
4、系统是公司多个项目的基础框架,稳定性好,支持大并发。 二、主要功能 1、采用ExtJS 4.2.1.883无限制版本,放心用于网站开发。 2、ExtJS富文本编辑器增加修改信息。 3、ExtJS的HtmlEditor的图片文件上传插件。 ...
4、系统是公司多个项目的基础框架,稳定性好,支持大并发。 二、主要功能 1、采用ExtJS 5.1无限制免费版本,放心用于网站开发。 2、ExtJS富文本编辑器增加修改信息。 3、ExtJS的HtmlEditor的图片文件上传插件。 4...
1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. ...
1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. ...
1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. ...
1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. ...