百度空间 | 百度首页 
 
查看文章
 
比较Java中几种数据cache方式
2008-03-03 13:54

现在很多网站一说到cache就想到memcached,memcached确实是非常优秀的系统,但是在某些场合,特别在不是分布式应用的场合,或者某些数据不需要分布式的访问,那它就未必是最佳的选择。

下面比较3种cache方式,用测试结果说话

  • Map,严格的说不能算cache,它适合本机访问,没有过期时间,不适合大容量,不能预计长度的数据,可能会使内存耗尽。
  • ehcache,可设过期时间,当超过指定内存数量,可设置淘汰算法,可输出到磁盘,可适合本机访问,也适合用作分布式缓存,分布式缓存配置和原理稍复杂,没有memcached直观,本测试未使用ehHcache分布式支持。
  • Memcached, 适合分布式缓存,可设过期时间

1. 环境
OS: Linux, Ubuntu 7.04 64-bit
Memory: 4G
CPU: Intel(R) Pentium(R) D CPU 2.66GHz
SCSI DISK, ext3 file system

libevent 1.3e
Memcached 1.2.4
Java 1.6.0

2. 测试方法
Key: 数字,1~100万
数据:100字节字符串

// put 100 char
Element e = new Element(String.valueOf(n), "blah.....blah... 100 chars...");
cache.put(e);

Memcache的设置方法参看memcachedb的性能测试

3. ehcache 设置
<cache name="cache1"
maxElementsInMemory="1000000"
eternal="true"
overflowToDisk="false"
timeToIdleSeconds="36000"
timeToLiveSeconds="36000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>

4. 测试结果

类型 测试数据
平均速度(次/秒)
最大速度(次/秒)
占用内存
Thread(s)
HashMap.put* 1千万
146,268
254,262
1344.18MB
1*
Hashtable.put 1千万
128,752
253,911
1572.52MB
4
EHCache.put 1千万
118,399
381,601
1245.08MB
4
Memcached.put 1百万
16,515
19,942
118.20MB
4

* HashMap 不是线程安全,多线程测试无意义。

* 未比较GET测试结果,由于GET测试先要模拟一定数据,用空表去测试GET结果可能无意义。(但是GET比较可能更重要,有时间补上)

本文地址为:http://hi.baidu.com/jabber

参考资源:NP博士的文章PHP cache的比较 《大型》系列(三)——Cache & Buffer

补充:

写完几天之后无意在网上看到这两篇文章:一正一反,

正方:Comparing Memcached and Ehcache Performance说ehcache要快50~100倍

反方:Unfair Benchmarks of Ehcache vs Memcached,貌似国内访问不到,里面意思是说要用memcached的getmulti方式测试比较才公平。另外担心ehcache中LRU算法GC不能回收内存。


类别:高性能服务器 | 添加到搜藏 | 浏览() | 评论 (4)
 
最近读者:
 
网友评论:
1
2008-03-09 09:40 | 回复
拿memcached和java的本地cache方案比较没什么意义啊!应用领域模型不同。
 
2
2008-03-28 23:36 | 回复
ehcache的毛病也不小, Cache.get()竟然要synchronized(this), 多线程访问性能下降太明显了
 
3
2008-08-29 14:54 | 回复
呵呵,看需求,用ehcache主要是因为它的通用性,该有的基本都有了,可以直接用。担心synchronized(this)影响性能的话,可以把对象按规则分布到多个Cache中,读取的时候再按同样的规则读取,应该可以一定程度上缓解(不过这是我想当然的,还没试过,呵呵)。 如果还不满意,那就只好自己按需求实现一个了,通用性和性能不能兼得啊,呵呵。
 
4
2008-11-15 02:37 | 回复
get不加synchronized怎么在多线程下访问? 难道memcache能避免吗?
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu