设为首页 收藏本站
查看: 2005|回复: 0

[经验分享] 常用的缓存产品比较-memcache与ehcache

[复制链接]

尚未签到

发表于 2015-11-18 08:59:22 | 显示全部楼层 |阅读模式

memcache与ehcache的选择


使用缓存的原则就是:尽量用低开销的计算代替高开销的计算。比如直接从其他数据库 查询的开销要远高于内存中的计算返回,网络请求要远高于本地(同一vm中)请求。


memcache:分布式应用 内存对象缓存系统开发,占用其他机子的内存。很多互联网 ,负载均衡三台(以三台为例)其他web服务器 可以共享一台memcache的资源。传递的信息以键值对的形式存储。传递的数据要实现序列化。


oscache:页面级缓存(网上强调最多的东西),占用本机的内存资源。可 以选择缓存到硬盘,如存取到硬盘重启服务也可重新获得上次持久化的资源,而如果缓存到内存就不行。一般没必要缓存到硬盘,因为i/o操作也是比较耗资源,和从其他数据库 取往往优势很小。oscache存取数据的作用域分为application和session两种。


ehcache:hibernate 缓存,dao缓存,安全性凭证缓存(acegi),web缓存,应用开发持久化和分布式应用 缓存。


ehcache在默认情况下,即在用户未提供自身配置文件ehcache.xml或ehcache-failsafe.xml时,ehcache会依据其自身jar存档包含的ehcache-failsafe.xml文件所定制的策略来管理缓存。如果用户在classpath下提供了ehcache.xml或ehcache-failsafe.xml文件,那么ehcache将会应用开发这个文件。如果两个文件同时提供,那么ehcache会使用ehcache.xml文件的配置。ehcache默认内容如下:


<ehcache>
<diskstore path=&quot;c:\acegi6&quot; />  
<defaultcache
maxelementsinmemory=&quot;10000&quot;
eternal
=&quot;false&quot;
timetoidleseconds
=&quot;120&quot;
timetoliveseconds
=&quot;120&quot;
overflowtodisk
=&quot;true&quot;
maxelementsondisk
=&quot;10000000&quot;
diskpersistent
=&quot;false&quot;
diskexpirythreadintervalseconds
=&quot;120&quot;
memorystoreevictionpolicy
=&quot;lru&quot;/>
</ehcache>




缓存有三个作用范围:事务、应用开发、集群。事务级缓存在session中有效;应用开发级缓存在多个session中可共享,因此尽可能只在read
only型应用开发中使用,而集群缓存就需要在各个节点上进行缓存同步。


ehcache中,这些都是在同一个应用开发的前提条件下的,如果是多个应用开发在数据层整合,那么任何一个范围都有可能出现问题。尤其是ehcache,是一个进程内的 (in
process)的缓存方案,受spring管理,每个web app的缓存相互独立(抛开classloader
share),基本上不可能实现多应用开发缓存共享。即使使用消息中间件进行监听,也不是一个完美的解决方案 。


    infoq里有一篇文章讲述了在java的工作需求中memcached超过了terracotta’s
ehcache以及oracle’s coherence 缓存框架, memcached surpasses ehcache and coherence in java job demand.




memcache与ehcache的一个对比表&#26684;:




项目



memcache



ehcache




分布式应用  



不完全,集群默认不实现



支持




集群



可通过客户端实现



支持(默认是异步同步)




持久化



可通过第三方应用开发实现,如sina研发的memcachedb,将cache的数据保存到[url=]berkerly
db[/url]



支持。持久化到本地硬盘,生成一个.data和.index文件。cache初始化时会自动查找这两个文件,将数据放入cache




效率






高于memcache




容灾



可通过客户端实现。



支持




缓存数据方式



缓存在memcached server向系统开发申请的内存中



可以缓存在内存(jvm中),也可以缓存在硬盘。通过cachemanager管理cache。多个cachemanager可配置在一个jvm内,cachemanager可管理多个cache。




缓存过期移除策略



lru



[url=]lru([/url]默认),fifo,lfu




缺点



功能不完善,相对于ehcache效率低



只适用于java体系,只能用java编写客户端




优点



简洁,灵活,所有支持socket的语言都能编写其客户端



效率高。功能强大。




有关ehcache更详细的信息  http://ehcache.org/documentation或http://192.168.2.159/?p=132 。




本地缓存与远程缓存


       根据缓存和应用开发的耦合程度将其划分为local
cache和remote cache。


local cache是指包含在应用开发之中的缓存组件,如ehcache,
oscache.


remote cache指和应用开发解耦,在应用开发之外的缓存组件,如memcached




local cache最大的优点是应用开发和cache在同一进程内部,请求缓存非常快速,完全不需要网







此文来自: 马开东博客 转载请注明出处 网址: http://www.makaidong.com


络开销,所以单应用开发,不需要集群,或者集群时cache
node不需要互相通知的情况下使用比较合适。




缺点:多个应用开发程序无法直接共享缓存,应用开发集群的情况下这个问题就更加明显(好像是废话=
=)



cache的类别:

本地缓存:从最简单的map到ehcache单机版都属于一类。

分布式应用 缓存:分布在不同jvm的cache可以互相同步与备份,如jbosscache和oracle那个天价的产品。

集中式缓存:最著名的代表是memcache,terracotta其实也属于透明的集中式架构

建议ehcache单机使用,因为terracotta收购后在分布式应用 缓存中必然侧重于tc,jgroup等广播通知方式已停止发展。注意:显示声明的cache项并不会默认从defaultcache节点继承属性,必须重新声明或使用ehcache内部的默认&#20540;。




memcached是一种集中式cache,支持分布式应用 横向扩展。


集中式架构


1.节点均衡的网状(jboss tree cache),利用jgroup的多广播通信机制来同步数据。


2.maste-slaves模式(分布式应用 文件系统开发),由master来管理slave,如何选择slave,如何迁移数据,都是由master来完成,但是master本身也存在单点问题。


应用开发点:


小对象的缓存(用户的token,权限信息,资源信息),小的静态资源缓存,sql结果的缓存。


应对高并发访问的应用开发,本地缓存采用ehcache,外部共享缓存采用memcached,两者集成结合使用,参考示例见相关链接及svn
checkout ehmem 示例。




memcached详细探讨


memcached介绍及分析


memcached 是一种集中式 cache,支持分布式应用 横向扩展。通过在内存里维护一个统一的巨大的hash表,memcached能够用来存储各种&#26684;式的数据,包







此文来自: 马开东博客 转载请注明出处 网址: http://www.makaidong.com


括图像、视频、文件以及其他数据库 检索的结果等。



memcached服务端本身是单实例的,只是在客户端实现开发过程 中可以根据存储的主键作分区存储,而这个区就是memcached服务端的一个或者多个实例,如果将客户端也囊括到memcached中,那么可以部分概念上说是集中式的。其实回顾一下集中式的构架,无非两种情况:1.节点均衡的网状(jboss
tree cache),利用jgroup的多播通信机制来同步数据。2.master-slaves模式(分布式应用 文件系统开发),由master来管理slave,如何选择slave,如何迁移数据,都是由master来完成,但是master本身也存在单点问题。


memcached内存分配机制:首先要说明的是memcached支持最大的存储对象为1m。key的长度小于250字符;像vmware,
xen这类虚拟化技术并不适合运行memcached; memcached未提供任何安全策略,仅仅通过telnet就可以访问到memcached, memcached java客户端代码的人就会了解其实客户端的事情很简单,就是要有一套高性能开发的 socket通信框架以及对 memcached 的私有协议实现的接口。


    在基于分布式应用 缓存的应用开发中,要确保每个缓存中的数据完全的一致是不可能的,总会存在这样那样的问题,即使像memcached,也因为没有commit机制,可能出现一个node上先放入cache,而最后transaction回滚,但其他的cache
node已经为其他用户提供了这个数据。


memcached的一些特点:



1、请求由client端进行处理,client端维护着一个memcached服务器开发列表,根据用户的请求将响应指向不同的memcached服务器开发;(也就是说,每个缓冲&#20540;,在所有服务器开发中只保持着一份copy,不像ehcache每个服务器开发中都有)

2、memcached对cpu的要求不高,但对内存要求较高,因此可以与webapp server安装在一起,互补(web
app server是cpu要求高,内存要求低)

3、可以动态地,甚至无限地增加memcached服务器开发的数量




首先memcached是独立的服务器开发组件,独立于应用开发系统开发,从客户端保存和读取对象到memcached是必须通过网络传输,因为网络传输都是二进制的数据,所以所有的对象都必须经过序列化,否则无法存储到memcahced的服务器开发端。


memcached采用 slab 内存处理机制


slab源于jeff bonwick  为  sunos 操作系统首次引入的一种内存处理机制,slab的设计理念是基于对象缓冲的,基本想法是避免重复大量的初始化和清理操作。slab主要可以用于频繁分配释放的内存对象。如果是采用系统开发自带的 malloc/free话,反复地操作会造成大量内存碎片,操作系统将会花费大量的时间去查找连续的内存块来满足malloc 的请求。


memcached为了提高内存的分配和回收效率,采用了slab和dump分区的概念。memcached一大优势就是能够充分利用memory资源,将同机器或者不同机器的memcached服务端组合成为对客户端看&#20284;统一的存储空间,memcached可以在一台机器上开多个端口作为服务端多个实








此文来自: 马开东博客 转载请注明出处 网址: http://www.makaidong.com


例,也可以在多台机器上开多个服务实例,而slab就是memcached的服务端。



以下是对cache的配置示例:


<?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?>
<memcached>
<client name=&quot;mclient0&quot; compressenable=&quot;true&quot; defaultencoding=&quot;utf-8&quot; socketpool=&quot;pool0&quot;>
<!--errorhandler></errorhandler-->
</client>
<client name=&quot;mclient1&quot; compressenable=&quot;true&quot; defaultencoding=&quot;utf-8&quot; socketpool=&quot;pool1&quot;>
<!--errorhandler></errorhandler-->
</client>
<client name=&quot;mclient11&quot; compressenable=&quot;true&quot; defaultencoding=&quot;utf-8&quot; socketpool=&quot;pool11&quot;>
<!--errorhandler></errorhandler-->
</client>
<socketpool name=&quot;pool0&quot; failover=&quot;true&quot; initconn=&quot;10&quot; minconn=&quot;5&quot; maxconn=&quot;250&quot; maintsleep=&quot;0&quot;
nagle
=&quot;false&quot; socketto=&quot;3000&quot; alivecheck=&quot;true&quot;>
<servers>192.168.2.159:13000,192.168.2.159:13001,192.168.2.159:13002</servers>
</socketpool>
<socketpool name=&quot;pool1&quot; failover=&quot;true&quot; initconn=&quot;10&quot; minconn=&quot;5&quot; maxconn=&quot;250&quot; maintsleep=&quot;0&quot;
nagle
=&quot;false&quot; socketto=&quot;3000&quot; alivecheck=&quot;true&quot;>
<servers>192.168.2.159:13000</servers>
</socketpool>  
<socketpool name=&quot;pool11&quot; failover=&quot;true&quot; initconn=&quot;10&quot; minconn=&quot;5&quot; maxconn=&quot;250&quot; maintsleep=&quot;0&quot;
nagle
=&quot;false&quot; socketto=&quot;3000&quot; alivecheck=&quot;true&quot;>
<servers>192.168.2.159:13000</servers>
</socketpool>  
<cluster name=&quot;cluster1&quot;>
<memcachedclients>mclient1,mclient11</memcachedclients>
</cluster>
</memcached>

可以看到其实pool才是最终连接服务端的配置,看看pool0,它会连接10.2.225.210:13000,10.2.225.210:13001,10.2.225.210:13002这些机器和他们的端口,但是对于使用pool0的mclient0来说它仅仅只是知道有一个叫做mclient0的cache可以保存数据。此时slab就有三个:10.2.225.210:13000和10.2.225.210:13001和10.2.225.210:13002。


当一个key:value要被放入到memcached中,首先memcached会根据key的hash算法获取到hash&#20540;来选择被分配的slab,然后根据value选择适合的dump区。所谓dump区其实就是根据value的大小来将内存按照存储单元内容大小分页。这个是可以配置memcached的,例如memcached将slab中的内存划分成4个dump,第一dump区存储0-50k大小的数据,第二dump区存储50-100k的数据,第三dump区存储100-500k的数据,第四dump区存储500-1000k的数据。那么当key:value需要被写入的时候,很容易定位到value所处的dump,分配内存给value。这种分dump模式简化内存管理,加速了内存回收和分配。但是这里需要注意的几点就是,首先当你的应用开发场景中保存的数据大小离散度很高,那么就不是很适合memcached的这种分配模式,容易造成浪费,例如第一dump区已经满了,第二第三dump区都还是只有一个数据,那么第二第三dump区不会被回收,第二第三dump区的空间就浪费了。同时memcached对于value的大小支持到1m,大于1m的内容不适合memcached存储




memcached 中内存分配机制主要理念


1.  先为分配相应的大块内存,再在上面进行无缝小对象填充


2.  懒惰检测机制,memcached 不花过多的时间在检测各个item对象是否超时,当 get获取数据时,才检查item对象是否应该删除,你不访问,我就不处理。


3.  懒惰删除机制,在 memecached 中删除一个 item对象的时候,并不是从内存中释放,而是单单的进行标记处理,再将其指针放入 slot回收插糟,下次分配的时候直接使用。




memcached的删除机制


memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期, 这种技术被称为lazy(惰性)expiration.因此,memcached不会在过期监视上耗费cpu时间;memcached会优先使用已超时的记录的空间,并使用lru算法来分配空间,因此当memcached的内存空间不足,就从最近违背使用的记录中搜索,并将空间分配给新的记录;不过在某些情况下lru机制会造成某些麻烦,如你并不想要淘汰已被缓存过的记录,可以在memcached启动时添加 -m 参数来禁止lru,但这样在memcached的内存用尽时,memcached会返回错误,是否使用lru。




memcached的基本设置


启动memcache的服务器开发端


# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -p /tmp/memcached.pid


memcached一些常用的命令选项:


      -p 监听的端口


      -l 连接的ip地址, 默认是本机


      -d start 启动memcached服务


      -d rest art 重起memcached服务


      -d stop|shutdown 关闭正在运行的memcached服务


      -d install 安装memcached服务


      -d uninstall 卸载memcached服务


      -u 以的身份运行 (仅在以root运行的时候有效)


      -m 最大内存使用,单位mb。默认64mb


      -m 内存耗尽时返回错误,而不是删除项


      -c 最大同时连接数,默认是1024


      -f 块大小增长因子,默认是1.25


      -n 最小分配空间,key&#43;value&#43;flags默认是48


      -h 显示帮助




memcache安装及配置


包安装


debian / ubuntu


apt-get install memcached


redhat / fedora


yum install memcached




源代码安装



tar –zxvf memcached-1.x.x.tar.gz

cd memcached-1.x.x

./configure

make && make test

sudo make install


备注:


1)  如果安装开发过程 中出现依赖包(比如libevent)找不到的情况,请安装相应的依赖包。


2)  如果出现找不到so的情况,通过ln –s /xxx/xxx.so /usr/lib/xxx.so做一个软链接解决。




服务器开发端配置


使用以下命令进行启动:


memcached –m 64 –l 10.11.11.33 –p 11211 –u xiajinxin


备注:


1)可以通过命令memcache –h来查看所有命令参数


2)可以通过追加参数-vv来进行调试输出


3)可以在同一台机器上启动多个memcached实例(端口不同)


具体可以参考:http://code.google.com/p/memcached/wiki/newconfiguringserver




集群配置


由于memcached服务器开发与服务器开发之间没有任何通讯,并且不进行任何数据复制备份,所以当任何服务器开发节点出现故障时,会出现单点故障,如果需要实现ha,则需要通过另外的方式来解决。


通过magent缓存代理,防止单点现象,缓存代理也可以做备份,通过客户端连接到缓存代理服务器开发,缓存代理服务器开发连接缓存连接服务器开发,缓存代理服务器开发可以连接多台memcached机器可以将每台memcached机器进行数据同步。如果其中一台缓存服务器开发down机,系统开发依然可以继续工作,如果其中一台memcached机器down掉,数据不会丢失并且可以保证数据的完整性。具体可以参考:http://code.google.com/p/memagent/




memcache集群的实现


memcached尽管是“分布式应用 ”缓存服务器开发,但服务器开发端并没有分布式应用 功能。各个memcached不会互相通信以共享信息。那么,怎样进行分布式应用 呢?这完全取决于客户端的实现。


DSC0000.jpg




memcached的分布式应用


memcached作为集中式cache,就存在着集中式的致命问题:单点问题,memcached支持多instance分布在多台机器上,仅仅只是解决了数据全部丢失的问题,但是当其中一台机器出错以后,还是会导致部分数据的丢失,一个篮子掉在地上还是会把部分的鸡蛋打破。


因此就需要实现一个备份机制,能够保证memcached在部分失效以后,数据还能够依然使用,当然大家很多时候都用cache不命中就去数据源获取的策略,但是在sip的场景中,如果部分信息找不到就去其他数据库 查找,那么要把sip弄垮真的是很容易,因此sip对于memcached中的数据认为是可信的,因此做cluster也是必要的。


DSC0001.jpg




1.应用开发传入需要操作的key,通过cachemanager获取配置在cluster中的客户端。


2.当获得cache client以后,执行cache操作。


3.  a.如果是读取操作,当不能命中时去集群其他cache客户端获取数据,如果获取到数据,尝试写入到本次获得的cache客户端,并返回结果。(达到数据恢复的作用)


b.如果是更新操作,在本次获取得cache客户端执行更新操作以后,立即返回,将更新集群其他机器命令提交给客户端的异步更新线程对列去异步执行。(由于如果是根据key来获取cache,那么异步执行不会影响到此主键的查询操作)


存在的问题:如果是设置了timeout的数据,那么在丢失以后被复制的开发过程 中就会变成永久有效的内容。




自定义cache接口实现与缓存框架解耦


由于缓存系统开发有很多,如memcached,oscache,ehcache,jbosscache等,其中oscache,ehcache,jbosscache是用java实现的开源的缓存框架,一个大型项目功能模块多,通常都集成了多个缓存系统开发。每套缓存框架都有各自的优缺点,随着项目的不断发展,更换缓存系统开发也是很有可能的,所以跟缓存系统开发的解耦是非常有必要的。


跟缓存进行解耦只需两个工作:


    1. 自定义缓存接口


    2. 实现各个缓存框架的adapter(适配器模式)。


下面给出一个示意图:


DSC0002.jpg




引用缓存策略


使用spring aop 抽出一个专门缓存切面,切面主要做两件事:


一、拦截类中定义的切入点;


二、进入切入点后,先从相应缓存中取key对应的value,如果取到&#20540;,就不执行切入点对应的开发方法 ;如果取不到&#20540;,则继续执行原来开发方法 。


    key:包名类名开发方法 名参数


    value:该开发方法 的返回&#20540;


   




windowns下使用


1.安装与启动


DSC0003.jpg


DSC0004.jpg




DSC0005.jpg


2.终端使用memcached


登录到缓存服务器开发,然后在cmd命令行中键入




DSC0006.jpg


DSC0007.jpg


DSC0008.jpg




DSC0009.jpg


DSC00010.jpg


DSC00011.jpg




查看 memcached 内部工作状态


访问访问 memcached :telnet  主机名  端口号


查看总状态: 查看总状态: stats stats


查看某项状态: 查看某项状态: stats curr_connections


选项  说明


add  仅当存储空间中不存在键相同的数据时才保存


replace  仅当存储空间中存在键相同的数据时才保存


set  与 add 和 replace 不同,无论何时都保存




缓存管理事项


1.  安装memcached


2.  memcached



搜索此文相关文章:常用的缓存产品比较
此文链接:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/60904.shtml
转载请注明出处:常用的缓存产品比较
- 博客园

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-140525-1-1.html 上篇帖子: CentOS安装memcached及配置php的memcache扩展 下篇帖子: php模块memcache和memcached区别分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表