【TalkingData技术分享】Java Cache性能分析
导语:在高并发的应用中,大量(访问文件、DB、远端服务调用等)操作会严重影响性能。使用Cache是一种比较常见的手段。
在高并发的应用中,大量(访问文件、DB、远端服务调用等)操作会严重影响性能。使用Cache是一种比较常见的手段。本文对比较常用的几种Cache做了一个性能测试,分享一下在不同场景下,使用什么样的Cache。
本文主要涉及的Cache(包括一些并不是缓存,但可以用来做缓存的东东)。
1. GuavaCache
A. 优点:有完善的缓存清理策略,在有清理策略的缓存中速度最快(限于本文中的缓存)。方便统计缓存命中率等信息。而且很轻量。
2. EhCache
A. 优点:可以使用硬盘来缓存数据。同样具有完善的清理策略。
B. 缺点:速度太慢。
3. ConcurrentHashMap
A. 优点:并发get和put会比HashTable快很多。
B. 缺点:这并不是一个缓存,你需要自己写缓存清理策略。
4. Hashtable
A. 优点:线程少时读写速度均很快。
B. 缺点:这并不是一个缓存,你需要自己写缓存清理策略。当线程多了,速度不及ConcurrentHashMap
5. Redis
A. 优点:可以多进程多机器公用内存,内存很节省,也有缓存清理策略。
B. 缺点:速度慢,需要自己写命中率之类的统计,最重要的是需要良好的网络环境。
从上述的优缺点来看,如果你知道要缓存的数量较少并且增长缓慢时,相比其它缓存使用ConcurrentHashMap可以显著增加你的速度。目前我常用的场景有数据库某些不大的表的缓存。如果你所缓存的数量很多,或者数量增长很快时,你不能将所有内容都缓存下来,你只能缓存一些你常用的,推荐GuavaCache。
测试的代码在JavaCacheAnalytics上,有感兴趣的同学可以自己跑跑试试,在此我只贴出部分测试结果。