缓存: Memcached和terracotta
缓存是最重要的一个方面,以提高应用程序性能的存储对象的缓存(内存)减少数据库负载。
缓存在群集环境中,需要分布式缓存解决方案,可以支持故障切换情景和数据的可靠性。 Memcached和terracotta兵马俑的分布式缓存解决方案。
Memcached是一个高性能的分布式对象缓存系统, 客户端的API为的Perl , PHP中,python, Ruby和Java语言。 以下是一些其能力和局限性(使用Java客户端API ) :
要求对象是可序列化
对象标识是不保留
支持高速缓存到期
不处理故障情景
对于一个特定对象选择一个服务器从池缓存服务器基于Hash的关键
容易配置(通过SockIOPool级)
terracotta秦始皇是一个开源基于Java的JVM集群解决方案。 分布式缓存可以实现使用兵马俑terracotta使用java.util.HashMap或开放源码的缓存解决方案,如EHCache , OSCache和JBoss TreeCache 。
保护对象的身份
通过有效地管理虚拟内存堆
声明要求锁定支持
简单的配置文件与Eclipse工具支持
良好的文件,支持和积极发展
不需要类是可序列化
容易配置并开始!
有一个老外网友使用terracotta后(见下面连接),发现CPU高负荷和GC时间暂停导致的应用响应时间延迟是其关键问题。而是要Memcached后,虽然 get/set有些慢(远程),但是相对数据库操作,memcached和ehcache差别可以忽略。
最后,他提出:可以使用ehcache作为本地in-process缓存,而memcached作为远程缓存。(对象状态第一次访问memcached获取后,缓存在本地ehcache中,以后就无需访问远程memcached,这样方案比较优化)。
兵马俑公司首席技术官阿里Zilka 认为:Memcached是因为使用非Java编写,所以没有GC,但他认为Memcached存在下面问题:
1. memcache分区是非常静态的(除非你改变它,或自定义) 。 这可能是一个大问题,因为您的网站成长 、
2. memcache分区会丢失数据。 如果您重新启动memcache服务器,数据丢失 。
http://hankliblog.blogspot.com/2008/01/bye-bye-terracotta-other-java-caches.html
当然,terracotta或ehcache可以通过JVM参数微调来实现响应时间延迟和高吞吐量的平衡。见twitter的JVM性能优化。
关于ehcache vs. memcached的2011年9月一文的最新讨论,主要是从memcached分布式缓存与ehcache代表数据网格之间区别方面讨论:
http://www.infoq.com/news/2011/09/java-memcached-rise
[该贴被admin于2011-11-25 07:52修改过]