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所写)
相关推荐
在本篇《Mybatis入门实例(二)——添加ehcache缓存支持》中,我们将深入探讨如何在Mybatis框架中集成Ehcache作为二级缓存,以提高数据访问的效率和性能。Ehcache是一个开源的Java分布式缓存,广泛用于缓存应用程序中...
第二级缓存可以存储更多数据,减少对数据库的依赖,提高并发性能。 **Ehcache的工作原理** Ehcache的工作基于“Least Recently Used”(LRU)策略,即最近最少使用的数据会被首先移出缓存,以腾出空间给新的数据。...
这里我们关注的是Ehcache的核心库,具体是三个不同版本——ehcache-core-2.6.11,ehcache-core-2.6.9,以及ehcache-core-2.5.0。 1. Ehcache核心功能: Ehcache的核心功能包括内存缓存、磁盘缓存、分布式缓存以及...
本文将详细探讨两种广泛使用的缓存解决方案——Ehcache和Memcached,它们都是为了减少对数据库的直接访问,从而提升系统的响应速度。我们将从性能、特性、适用场景等方面进行比较。 首先,Ehcache是一款基于Java的...
标题“memcached完全剖析ehcache memcached redis 缓存技术总结”表明,这篇内容将深入探讨三种流行的缓存技术——Memcached、Ehcache和Redis。缓存是IT行业中用于提高系统性能的关键技术,尤其是在大数据量和高并发...
本项目" Ehcache+xmemcached+redis 整合spring注解demo"旨在演示如何将这三种主流的缓存技术——Ehcache、xmemcached和Redis——与Spring框架的注解功能相结合,以实现高效、灵活的缓存管理。以下是对这些知识点的...
2. **对并发要求不是非常严格的场景**:由于Ehcache的分布式缓存机制并不是实时同步的,因此适用于对数据一致性要求不高的场景。 #### 四、Ehcache的基本配置 Ehcache的配置文件`ehcache.xml`定义了缓存行为的核心...
在这个名为 "mybatis第三方缓存需要的文件.zip" 的压缩包中,包含的是 MyBatis 整合第三方缓存——EhCache 的相关组件和配置文件。 首先,我们要了解 EhCache 是一个开源的 Java 缓存库,它可以被用于存储和检索...
《JiveJdon——3.1:Java学习的宝贵资源》 在编程世界里,Java是一种广泛应用的编程语言,尤其在企业级应用开发领域占据着举足轻重的地位。"JiveJdon"是一个专为Java爱好者和学习者提供的论坛源代码,它为我们提供...
【描述】:本文将深入探讨三个广泛使用的缓存系统——Ehcache、Memcached 和 Redis,分析它们的特点、优缺点以及适用场景,帮助读者理解这三大“缓存男高音”的差异,并提供实践建议。 【标签】:互联网 【正文】...
本文将深入探讨该系统中采用的分布式缓存——Ehcache,以及其在系统中的应用与配置。 1. **Ehcache介绍** Ehcache是一款开源、高性能、轻量级的Java缓存库,广泛应用于Java应用程序中,提供本地内存缓存和分布式...
### 分布式缓存架构——Spring Boot搭建Ehcache+Redis的二级缓存 #### 一、引言 随着互联网应用的不断普及和发展,对于数据处理能力的要求越来越高,特别是对于那些高并发、低延迟的应用场景而言,缓存技术成为了...
该测试报告主要对比分析了三种流行的分布式缓存系统——memcache、redis和tair在不同条件下的性能表现,以供选择适合特定需求的缓存解决方案。测试场景涵盖了单机环境和分布式环境,关注点在于缓存数据的设置和获取...
为了优化性能和用户体验,可能还会涉及到缓存技术,如Ehcache或Redis,用于存储频繁访问的数据,减少对数据库的直接访问。 此外,考虑到移动设备的网络环境可能不稳定,系统的响应时间和数据传输量都是需要考虑的...
《通用后台管理系统——基于ExtJS 4.2+Hibernate 4.1.7+Spring MVC 3.2.8的高效框架》 本通用后台管理系统是一款高效、稳定且灵活的开发框架,适用于构建OA、网站、电子政务、ERP、CRM、APP后台等多种B/S架构的应用...
3. **Ehcache**:Ehcache是一款广泛使用的开源Java缓存解决方案,支持内存和磁盘存储,具有线程安全、分布式缓存等功能。它可以与Spring框架无缝集成,非常适合大型项目。 4. **JCache (JSR-107)**:Java Caching ...
《超市订单系统——基于Oracle与MySQL的实现》 在当今数字化时代,超市订单系统的构建对于提升零售业务效率、优化客户体验具有重要意义。本系统利用先进的技术框架,如Spring、SpringMVC、MyBatis,以及第三方缓存...
这份报告详细对比了三种常用的内存数据库——memcache、redis以及tair的性能表现。测试目的是为了评估这些缓存工具在不同场景下的处理能力,特别是在并发操作和不同大小的数据存储上的效率。测试环境包含了单机环境...
综上所述,**校六后台架构**通过精心设计的技术方案和合理的服务器配置,实现了对高并发、高可用性以及集群可扩展性的有效支持。这一架构不仅确保了“校六”移动社交应用的稳定运行,也为类似项目的开发提供了宝贵的...
Spring Boot 提供了对多种缓存技术的支持,包括但不限于 Redis、Ehcache、Caffeine 等。缓存技术可以帮助提高应用性能,减轻数据库压力。 #### 其他内容 - **定时任务**:通过 `@Scheduled` 注解或使用 Quartz 等...