最近有个项目要使用cache,正在做Ehcache的技术试验。
现在同事向我提出一问题:
Ehcache内部如何管理缓存更新?
业务场景:可能存在多个线程同时向一个cache更新数据(总量约为平均每秒3万条左右),IBM
MQ我们做过试验,在代入业务逻辑的场景下,这个吞吐量可能吃不消。现在准备自己实现业务逻辑,用cache缓存数据提供给前端的Server使用。如果
2个线程同时更新缓存中的同一条记录(比如线程1处理了第一秒的数据,线程2处理了第2秒的数据,但是线程1由于其他原因导致与线程2同时向cache
put element)
请问这种情况下内部更新机制如何?
PDF读了一遍,貌似没有看到关于这方面的描述,只有FIFO,LRU,LFU的介绍。
两个线程如果同时修改一个Cache中不同的两个数据,他们之间不会互相影响。也不会造成死锁。
如果修改的数据是同一个,则后写的线程的数据将被保留。也没有死锁的问题。
Ehcache枷锁的基本原理如下:
Ehcache是在读的时候对Key获取一个读锁,这样并发读互相不会影响。当写的时候,对Key获取一个写锁,同一时刻只能有一个线程获得写锁,因此会屏蔽掉其它的写线程和读线程。等写操作完成后,写锁倍释放,其它线程可以进来继续其它操作。
如果还有疑问,请把问题进一步描述清楚。
谢谢!
老马
感谢老马。
补充一个问题,就是如果采用了集群缓存的环境,两个节点上的不同线程分别对各自节点缓存中的同一个数据进行写操作,那么此时的写锁生效么?如何同步呢?
如果两个节点分别在各自节点修改同一个共享的数据(PUT),写锁会生效的。最后一个PUT的节点的数据会被保存在共享缓存中。
不过如果你先从CACHE中GET出一个数据,然会分别修改这个对象,这种情况下,由于对象已经脱离CACHE,也就没有任何保护。对这个对象的修改是没有锁的。只有在PUT的时候锁才会生效。
如果你那到的是个银行帐户信息。
两个节点分别往里面存100元钱。Ehcache的写锁不能保证最后的结果是帐户增加了200元。如果要达到这个效果,必须使用ExplicitLockingCache来实现对Key的锁,而不只是在PUT或者GET的进行枷锁。
老马
老马,你的意思是如果我在节点一进行了PUT操作,对一个缓存对象进行了update,那么在我put的过程中,实际上集群内的节点二、节点三等等此时该对象的一个本地副本都是处于写入锁状态的么?
是的。在PUT的过程中,数据事有保护,并且安全的。
老马
两个线程如果同时修改一个Cache中不同的两个数据,他们之间不会互相影响。也不会造成死锁。
如果修改的数据是同一个,则后写的线程的数据将被保留。也没有死锁的问题。
Ehcache枷锁的基本原理如下:
Ehcache是在读的时候对Key获取一个读锁,这样并发读互相不会影响。当写的时候,对Key获取一个写锁,同一时刻只能有一个线程获得写锁,因此会屏蔽掉其它的写线程和读线程。等写操作完成后,写锁倍释放,其它线程可以进来继续其它操作。
如果还有疑问,请把问题进一步描述清楚。
谢谢!
老马
Ehcache的这种锁机制,对于业务来说是没有多大意义的.
业务中更多的是需要保证数据的一致性:
即对于缓存中的有一个数据,当线程1更新之后,线程2的更新需要基于线程1的更新来做,否则,线程2的更新将直接冲掉线程1的更新,导致业务出错.
如上述存钱的问题,最后导致客户不见了100块,这是业务绝对不可以接受的.
正确的锁机制应该是:
每个缓存数据都应该有一个版本号, 当线程1更新数据之后,要同步更新版本号, 线程2更新的时候应该检查手中数据版本号与缓存中的是否一致,
一致才可以更新, 如果不一致,就不允许更新,并给出警告.
分享到:
相关推荐
通过这些示例,我们可以学习如何设置Ehcache的分布式特性,例如使用Terracotta服务器进行集群缓存,以及如何处理分布式环境下的缓存一致性问题。 总结来说,Ehcache的监控涉及了多个方面,包括但不限于使用JMX、Web...
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是一个开源的、高性能的、内存级的缓存解决方案,广泛应用于Java应用程序中,以提高数据访问速度和减少数据库负载。这个项目提供了一个简单的Ehcache使用示例,帮助开发者了解如何集成和利用Ehcache提升应用...
解决这些问题通常需要合理配置Ehcache的缓存策略和故障恢复机制,以及优化网络通信。 总的来说,Ehcache在SpringBoot中的应用能显著提升系统的响应速度和可扩展性,尤其是在处理大量数据或高并发场景下。通过灵活的...
9. **Dorm 文件**:这个文件可能是一个示例或测试数据,用于演示 Hibernate 和 Ehcache 整合后如何处理数据存储和检索。在实际项目中,Dorm 可能代表“Data Object Representation Model”,即数据对象表示模型,...
7. **事件监听(Event Listeners)**:Ehcache支持添加监听器来监控缓存操作,例如缓存项的添加、更新和移除,便于进行相应的业务逻辑处理。 `ehcache-core-2.5.2-sources.jar`则是Ehcache的源代码文件,开发者可以...
3. IDE集成:将ehcache.xsd导入到IDE(如IntelliJ IDEA、Eclipse等)中,可以实现代码提示和自动完成,提高开发效率,减少因配置错误导致的问题。 4. XML配置:ehcache.xml是Ehcache的配置文件,通过它来设定缓存的...
ehcache 的 xsd 文件
**Ehcache 知识详解** Ehcache 是一个开源的、高性能的缓存解决方案,广泛应用于Java应用程序中,尤其在提升系统性能和减少数据库负载方面表现突出。它支持内存和磁盘存储,并且可以与Java持久层框架如Hibernate、...
赠送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-...
ehcache3-samples, 关于使用 Ehcache 3,一些示例/教程 Ehcache示例这里知识库包含有关 Ehcache 3用法的示例和教程。示例'basic'演示 Ehcache 3的基本配置和用法'集群'- 演示如何在Terracotta服务器上使用分布式缓存...
Ehcache在处理高并发和大数据量的场景下表现出色,尤其适用于那些频繁读取但不经常修改的数据。在本资料包中,我们包含了Ehcache的核心jar包,这将帮助开发者直接集成Ehcache到他们的项目中。 **Ehcache的主要特性...
本篇将详细探讨如何使用Hibernate ORM框架结合EhCache实现数据缓存的处理,从而提高系统的响应速度。 Hibernate是一个流行的Java持久化框架,它提供了一种便捷的方式来映射对象关系模型(ORM)到关系数据库。然而,...
7. **异常处理**: 在使用Ehcache时,要注意处理可能的异常,如`CacheException`、`CacheNotFoundException`等,确保程序的健壮性。 8. **Web会话缓存**: Ehcache-web插件通过拦截Servlet请求,实现会话的缓存。配置...
3. **Eviction Listeners**: 可以设置监听器来处理元素移除事件,例如通知系统进行进一步操作。 **Ehcache示例** 在`Ehcache_Hello`这个案例中,开发者可能会创建一个简单的缓存区,并通过API添加、获取和移除缓存...
**正文** EHcache是一款广泛使用的开源Java分布式缓存系统,主要设计用于提高应用程序的性能和可伸缩性。在Java应用程序中,特别是那些基于...正确地集成和配置EHcache,能够显著提升系统的响应速度和处理能力。
此外,我们可以通过反射来模拟不同的场景,比如在测试中更改对象的状态,然后检查Ehcache如何根据新的状态处理缓存。 在提供的文件列表中,我们看到几个关键的项目: 1. `.classpath` 和 `.project` 文件是Eclipse...
它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。 Ehcache最初是由Greg Luck于2003年开始开发。2009年,该项目被Terracotta购买。软件仍然是开源,...
6. **异常处理**:源码中包含了异常处理逻辑,当缓存操作出现问题时,能够适当地回退到数据库查询,并记录日志,以便于问题排查。 通过对 Mybatis-ehcache 1.2.1 的源码学习,开发者可以更好地理解缓存如何与 ORM ...
本篇文章将详细探讨MyBatis与Ehcache的集成以及`ehcache.xsd`和`ehcache.xml`这两个配置文件在其中的作用。 首先,Ehcache是一个开源的、高性能的Java缓存库,它能够极大地减少对数据库的访问,提高应用程序的响应...