本地缓存(一)ehcache/jcs/cache4j/jcs的性能测试与使用场景分析

前言

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

整理初稿

猜你喜欢

转载自phl.iteye.com/blog/2240901