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