前言
之前在网上看过几篇本地缓存的性能测试,但只看到了一个结果,没有看到具体测试的方案和使用场景。因此猫头哥放假期间,整理了一份阅兵版的缓存性能分析。另外朋友们需要脱离一个认知误区,就是不要拿本地缓存和分布式缓存做比较。localcache的作用,是解决分布式缓存节点过热问题,作为L1 cache挡在分布式缓存的前面。
关于测试过程中,要注意以下几个事项:
- 环境仿真度:关闭占用CPU的无用软件,保持CPU是0%使用,笔者机器上有浏览器、360、赛肽客驱动等等;代码中用栅栏,让与缓存无关的数据提前运行准备;
- 多线程测试:不要做单线程的循环,一次存取基本意义不大,互联网架构都是高并发场景才会使用缓存;
- 测试场景:分为:插入、miss、hit几个场景;
- 性能优化:针对不同的缓存组件,要做性能优化,比如oscache的blocking设置不同,性能是不一一样的;
- 场景分析:不要只说哪个性能好,哪个性能坏。其实不同的场景是有区别的,没有绝
测试数据
在4C的PC上运行(I5-3230),单位:毫秒
最新版本 |
Ehcache_2.10.0 |
oscache_2.4.1 |
jcs_1.3 |
cache4j_0.4 |
4线程插入100W |
6093 |
2828 |
2489 |
1460 |
32线程插入100W |
6989 |
2161 blocking=false |
2143 |
2424 |
4线程读取(hit)100W |
862 |
575 |
253 |
820 |
32线程读取(hit)100W |
490 |
573 |
323 |
846 |
4线程读取(miss)100W |
965 |
1225 |
166 |
68 |
32线程读取(miss)100W |
421 |
1325 |
182 |
97 |
组件代码量 |
极多 |
多 |
少 |
极少 |
组件丰富度 |
★★★★★ |
★★★ |
★ |
★ |
功能 |
★★★★★ |
★★★★ |
★★ |
★ |
最后更新 |
2015.4.2 |
2011.1.11 |
2007.5.30 |
2006.2.23 |
echache的多线程插入性能最差。oscache的插入性能最好,因为oscache开启了cache.blocking=false,也就是异步插入,但会导致很多读取未命中,对强一致性有要求的可以开启。作为内存缓存,没有业务场景会有这么大的插入量。
从命中读取上看,jcs表现最好,其他的读取性能区别都不明显,都是1秒以内。而ehcache的多线程读取以后,读取能力有一定的提高,非常适合高并发的web应用,oscache的多线程读取稳定性能也是非常棒。
未命中的情况下,可以看到,cache4j的表现最好,ehcache、jcs的表现也没有落后太多,完全在可接受范围内。而oscache表现的略微差一点点。既然使用了缓存,缓存命中率应该保持在90%以上才叫缓存,因此此项性能影响也不是特别大。
ehcache和oscache都是大型缓存组件,对web都支持的非常好。尤其ehcache持续更细,2009被兵马俑(terracotta)收购后,集成缓存功能更是强大。ehcache一直保持更新。 oscahce的更和社区支持,稍微差了一点,已经有将近4年没有更新。
以上性能测试报告的结果说明,插入性能、未命中的性能差距并不是特别明显。命中率读取除了JCS以外其他缓存差距并不大。如果只是为了使用增加个失效时间的map,那jcs是最好的;如果只是想用个最简单的缓存组件,尽量减少代码,那cache4j是首选;如果考虑强大的扩展性和web支持,那肯定要选择ehcache或则oscache。但是oscache有一个致命缺陷,就是从2011年开始,已经有4年没有进行更新。
综合来看ehcache的多线程命中读取性能、web支持、分布式集成、社区支持程度、更新的速度、应用的广泛程度。作为缓存的不二选择。
不足
欢迎朋友们继续深入研究,把研究结果分享出来,我们一起进步。后续猫头哥会把本次测试中的不足逐渐完善。测试结果和网上传出的参考文章,基本一致。文章绝对原创,彼此尊重劳动成果,转载请注明出处。
- 代码运行环境,应该在linux下最好
- 测试用例代码冗余较多,没有进行设计
- 测试用例没有长期运行,只是运行了3-5次,取了成绩最好的数据
参考文章
http://www.jdon.com/37031
http://sourceforge.net/projects/cache4j/
更新历史
2015-09-05
整理初稿
相关推荐
本文将深入探讨四种知名的缓存解决方案:ShiftOne Cache、SwarmCache、EHCache以及JCS(Java Caching System),并分析它们的源码,以理解其工作原理和优化策略。 首先,让我们来看看ShiftOne Cache。这是一个轻量...
Java Cache System(JCS)是一个开源的、基于内存的分布式缓存系统,主要用来提高应用程序的性能和响应速度。在大型分布式系统中,通过缓存关键数据,可以显著减少数据库的访问压力,从而提升整体系统的处理能力。...
1. **与 Ehcache 比较**:Ehcache 是一个广泛使用的 Java 缓存框架,侧重于内存缓存,而 JCS 在分布式缓存方面更加强大。 2. **与 Redis 比较**:Redis 是一个内存数据结构存储系统,功能更全面,但 JCS 更专注于 ...
Ehcache是一个开源的、广泛使用的Java缓存解决方案,它为高性能应用程序提供了本地内存缓存功能。在Java世界中,Ehcache被设计用来提高数据访问速度,减少数据库负载,从而提升整体应用性能。本文将深入探讨Ehcache...
6. **其他缓存技术**:除了OSCache和JCS,JAVAWeb还有其他缓存技术,如Hibernate的二级缓存、 Ehcache、Guava Cache等,它们各有特点,适应不同的场景。 总的来说,JAVAWeb缓存技术的选型和使用是一项复杂而重要的...
总之,`spring-modules-cache.jar`中的Spring Modules Cache是Spring框架的一个强大补充,它简化了缓存的管理和使用,帮助开发者构建高性能、易维护的Java应用。无论是在单体应用还是微服务架构中,这个库都能发挥...
最后,cache4j提供了一个简单API的快速Java对象缓存,支持多种缓存清除策略,如LFU、LRU和FIFO,并可以选择使用强引用或软引用。 这些缓存框架各有优势,开发者应根据项目需求选择合适的缓存解决方案。例如,如果...
**EHCache** 是一个广泛使用的高性能、轻量级的Java缓存库。最初是为了配合Hibernate 2.1版本而设计的,但现在已经被许多项目采用作为通用的缓存解决方案。EHCache支持多种缓存模式,包括本地缓存、分布式缓存等,...
总结起来,文档深入探讨了Java中缓存技术的多个方面,包括Hibernate框架中的缓存使用、不同缓存策略的实现、本地缓存与分布式缓存的区别和配置、以及Java缓存技术在企业应用中的实际应用。这些知识对于Java开发者来...
【内存缓存(Memory Cache)】在Java的内存管理中,内存缓存是一种优化策略,它的目的是减少对数据库或其他外部资源的访问,从而提高应用程序的性能。内存缓存利用计算机的内存来存储常用数据,使得数据获取速度比...
徽章 ====== 抽象缓存框架####特征 : 提供用于缓存的包装器(如用于日志记录的 slf4j)。 支持 Ehcache、Infinispan 和 Memcached 缓存库。 ####目标: 为现有的缓存框架(如 JCS 和 Hazelcast)提供支持。 为...
5. 典型的缓存框架:EHcache、Jbosscache、OSCache、JCS、Tangosol Coherence等。 6. 缓存框架的实现:使用JAVA语言,关系数据库,WebSphere Server等技术,实现缓存框架。 7. 缓存框架的测试结果:测试了写入内存...
OSCache 是一款广泛使用的高性能Java EE缓存框架,适用于任何Java应用程序。它的特点包括: - **灵活的缓存对象**:允许缓存任何类型的数据,如JSP页面、HTTP请求或Java对象。 - **全面的API**:提供了丰富的API供...
电子书还涉及了一些与开发环境有关的话题,例如在Linux下搭建Tiny开发环境、如何重构SmartAdmin来展示TinyUI、在Tiny框架中引入缓存解决方案如EhCache和JCS,以及如何利用Tiny框架中的组件来进行Web界面开发等。...
这是一个如何使用REST和Hazelcast生成缓存的示例: 禁用默认配置文件binarycache-provider-ehcache 启用配置文件binarycache-proivder-hazelcast 检查binarycache-connect-rest配置文件是否仍处于活动状态 对...