Ehcache(07)——Ehcache对并发的支持

简介: Ehcache对并发的支持          在高并发的情况下,使用Ehcache缓存时,由于并发的读与写,我们读的数据有可能是错误的,我们写的数据也有可能意外的被覆盖。所幸的是Ehcache为我们提供了针对于缓存元素Key的Read(读)、Write(写)锁。

Ehcache对并发的支持

 

       在高并发的情况下,使用Ehcache缓存时,由于并发的读与写,我们读的数据有可能是错误的,我们写的数据也有可能意外的被覆盖。所幸的是Ehcache为我们提供了针对于缓存元素KeyRead(读)、Write(写)锁。当一个线程获取了某一KeyRead锁之后,其它线程获取针对于同一个KeyRead锁不会受到限制,但其它线程(包括获取了该KeyRead锁的线程)如果想获取针对同一个KeyWrite锁就不行,它需要等到针对于该KeyRead锁释放后才能获取其Write锁;当一个线程获取了某一KeyWrite锁之后,其它线程获取同一个KeyRead锁或者Write锁的请求将等待针对于该KeyWrite锁释放后才能继续进行,但是同一个线程获取该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所写)

目录
相关文章
|
12月前
|
Prometheus 监控 Cloud Native
无痛入门Prometheus:一个强大的开源监控和告警系统,如何快速安装和使用?
Prometheus 是一个完全开源的系统监控和告警工具包,受 Google 内部 BorgMon 系统启发,自2012年由前 Google 工程师在 SoundCloud 开发以来,已被众多公司采用。它拥有活跃的开发者和用户社区,现为独立开源项目,并于2016年加入云原生计算基金会(CNCF)。Prometheus 的主要特点包括多维数据模型、灵活的查询语言 PromQL、不依赖分布式存储、通过 HTTP 拉取时间序列数据等。其架构简单且功能强大,支持多种图形和仪表盘展示模式。安装和使用 Prometheus 非常简便,可以通过 Docker 快速部署,并与 Grafana 等可
5911 2
|
6月前
|
XML JSON API
API接口——连接世界,让你的数据畅通无阻!
API(应用程序编程接口)是连接不同软件系统的桥梁,如同数字世界的“万能适配器”。它通过标准化协议(如RESTful)和数据格式(如JSON/XML),实现前端请求与后端服务的无缝交互。API不仅提升了系统间的协作效率,还通过OAuth 2.0等技术保障安全性,并支持流量管控以优化性能。其应用场景广泛,包括金融科技、物联网、电子商务和社会化平台,为企业带来显著效益,如降低成本、提升响应速度和用户增长。未来,API将向智能化、微服务化、低代码集成和隐私计算方向发展,成为构建数字生态的核心技术,助力万物互联时代的创新与发展。
1088 1
|
数据采集 分布式计算 OLAP
最佳实践:AnalyticDB在企业级大数据分析中的应用案例
【10月更文挑战第22天】在数字化转型的大潮中,企业对数据的依赖程度越来越高。如何高效地处理和分析海量数据,从中提取有价值的洞察,成为企业竞争力的关键。作为阿里云推出的一款实时OLAP数据库服务,AnalyticDB(ADB)凭借其强大的数据处理能力和亚秒级的查询响应时间,已经在多个行业和业务场景中得到了广泛应用。本文将从个人的角度出发,分享多个成功案例,展示AnalyticDB如何助力企业在广告投放效果分析、用户行为追踪、财务报表生成等领域实现高效的数据处理与洞察发现。
1057 0
|
SQL Java 数据库连接
快速搭建SSM项目【最全教程】~令狐小哥版
快速搭建SSM项目【最全教程】~令狐小哥版
820 1
|
缓存 监控 负载均衡
Java一分钟之-Ehcache:分布式缓存系统
【6月更文挑战第17天】**Ehcache是Java的开源缓存库,支持本地和分布式缓存,提供负载均衡、数据复制和容错能力。常见问题包括网络分区导致的数据不一致、缓存雪崩和配置不当引起的性能瓶颈。解决策略涉及选择强一致性策略、设置合理缓存过期时间和监控调整配置。使用Ehcache需添加相关依赖,并配置分布式缓存,如示例所示,通过CacheManager创建和管理缓存。实践中,持续监控和优化配置至关重要。**
428 1
|
存储 监控 数据库
neo4j如何查看日志信息
【5月更文挑战第2天】neo4j如何查看日志信息
840 2
|
NoSQL MongoDB 数据库
MongoDB数据恢复—MongoDB数据库文件被破坏的数据恢复案例
服务器数据恢复环境: 一台Windows Server操作系统服务器,服务器上部署MongoDB数据库。 MongoDB数据库故障&检测: 工作人员在未关闭MongoDB数据库服务的情况下,将数据库文件拷贝到其他分区。拷贝完成后将原MongoDB数据库所在分区进行了格式化操作,然后将数据库文件拷回原分区,重新启动MongoDB服务,服务无法启动。
|
Ubuntu 应用服务中间件 nginx
Ubuntu系统重启自动启动Docker容器
Ubuntu系统重启自动启动Docker容器
1539 1
|
存储 NoSQL MongoDB
MongoDB【部署 04】Windows系统实现MongoDB多磁盘存储
MongoDB【部署 04】Windows系统实现MongoDB多磁盘存储
544 0