前言
之前在网上看过几篇本地缓存的性能测试,但只看到了一个结果,没有看到具体测试的方案和使用场景。因此猫头哥放假期间,整理了一份阅兵版的缓存性能分析。另外朋友们需要脱离一个认知误区,就是不要拿本地缓存和分布式缓存做比较。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
整理初稿