本文目录导航:
PHP中4个减速,缓存裁减的区别和决定倡导
1、eAcceleratoreAccelerator是一个自在开明源码PHP减速器,提升和灵活内容缓存,提高了PHP脚本的缓存功能,使得PHP脚本在编译的形态下,对主机的开支简直齐全消弭。
它还有对脚本起提升作用,以放慢其口头效率。
使PHP程序代码执效率能提高1-10倍。
从文字上可以了解为:eAccelerator是PHP减速器裁减。
2、memcachedMemcached 是一个高功能的散布式内存对象缓存系统,用于灵活Web运行以减轻数据库负载。
它经过在内存中缓存数据和对象来缩小读取数据库的次数,从而提供灵活、数据库驱动网站的速度。
从文字上可以了解为:内存缓存裁减,并且针关于集群主机经常使用较多,重要用于散布式缓存,算是数据库缓存。
3、Alternative PHP Cache(APC缓存)Alternative PHP Cache (APC缓存)是一种对PHP有效的开明源高速缓冲贮存器工具,他能够缓存Opcode(指标文件)的PHP两边码。
APC的缓存分两局部:系统缓存和用户数据缓存. 系统缓存 是智能经常使用的,是指APC把PHP文件源码的编译结果缓存起来,而后在再次调用时先对比期间标志。
假设未过时,则经常使用缓存代码运转。
自动缓存 3600s(一小时).然而这样仍会糜费少量CPU期间.因此可以在中设置system缓存为永不过时(=0).不过假设这样设置,改运PHP代码后须要restart一下您的web主机(比如apache…).目前对APC的功能测试普通指的是这一层cache;从文字上理到:Alternative PHP Cache(APC缓存)也算是一种内存缓存裁减,算是数据库缓存裁减。
4、Xcache是一个开源的opcode缓存器/提升器, 他能够提高主机上的PHP功能,他经过把编译PHP后的数据缓冲到共享内存从而防止重复的编译环节, 能够间接经常使用缓冲区已编译的代码从而提高速度. 理论能够提高您的页面熟成速率2到5倍, 降落主机负载。
其实它与eAccelerator一样是PHP减速器裁减。
以上就是他们的作用与区别,繁难一点就是:eAccelerator,xcache是PHP缓存裁减,memcached、APC缓存是数据库缓存裁减,普通两者只要要装置其中一个即可,不要贪多。
另外,实践测试中发现当Cache数量超越必定阀值的时刻,APC的功能不如Memcache。
所以在裁减的决定上,自己普通会决定xcache+memcached这个组合。
Memcached怎样读
中文音译出的字为什么会差这么远!…… 用我的发音卖母开斥(的)
php的memcached散布式hash算法,如何处置散布不均?crc32这个算法没方法把key值平均的散布进来
memcached的总结和散布式分歧性hash以后很多大型的web系统为了减轻数据库主机负载,会驳回memchached作为缓存系统以提高照应速度。
目录: ()memchached简介 hash 取模 分歧性hash 虚构节点 源码解析 参考资料 1. memchached简介 memcached是一个开源的高功能散布式内存对象缓存系统。
其实思维还是比拟繁难的,成功包含server端(memcached开源名目普通只单指server端)和client端两局部: server端实质是一个in-memory key-value store,经过在内存中保养一个大的hashmap用来存储小块的恣意数据,对外经过一致的繁难接口(memcached protocol)来提供操作。
client端是一个library,担任处置memcached protocol的网络通讯细节,与memcached server通讯,针对各种言语的不同成功分装了易用的API成功了与不同言语平台的集成。
web系统则经过client库来经常使用memcached启动对象缓存。
2. hash memcached的散布式重要体如今client端,关于server端,仅仅是部署多个memcached server组成集群,每个server独自保养自己的数据(相互之间没有任何通讯),经过daemon监听端口期待client端的恳求。
而在client端,经过火歧的hash算法,将要存储的数据散布到某个特定的server上启动存储,后续读取查问经常使用雷同的hash算法即可定位。
client端可以驳回各种hash算法来定位server: 取模 最繁难的hash算法 targetServer = serverList[hash(key) % ] 间接用key的hash值(计算key的hash值的方法可以自在决定,比如算法CRC32、MD5,甚至本地hash系统,如java的hashcode)模上server总数来定位指标server。
这种算法不只繁难,而且具备不错的随机散布个性。
然而疑问也很显著,server总数不能随便变动。
由于假设参与/缩小memcached server的数量,对原先存储的一切key的后续查问都将定位到别的server上,造成一切的cache都不能被命中而失效。
分歧性hash 为了处置这个疑问,须要驳回分歧性hash算法(consistent hash) 相关于取模的算法,分歧性hash算法除了计算key的hash值外,还会计算每个server对应的hash值,而后将这些hash值映射到一个有限的值域上(比如0~2^32)。
经过寻觅hash值大于hash(key)的最小server作为存储该key数据的指标server。
假设找不到,则间接把具备最小hash值的server作为指标server。
为了繁难了解,可以把这个有限值域了解成一个环,值顺时针递增。
如上图所示,集群中一共有5个memcached server,已经过server的hash值散布到环中。
假设如今有一个写入cache的恳求,首先计算x=hash(key),映射到环中,而后从x顺时针查找,把找到的第一个server作为指标server来存储cache,假设超越了2^32依然找不到,则命中第一个server。
比如x的值介于A~B之间,那么命中的server节点应该是B节点 可以看到,经过这种算法,关于同一个key,存储和后续的查问都会定位到同一个memcached server上。
那么它是怎样处置增/删server造成的cache不能命中的疑问呢? 假定,如今参与一个server F,如下图 此时,cache不能命中的疑问依然存在,然而只存在于B~F之间的位置(由C变成了F),其余位置(包含F~C)的cache的命中不受影响(删除server的状况相似)。
虽然依然有cache不能命中的存在,然而相关于取模的模式曾经大幅缩小了不能命中的cache数量。
虚构节点 然而,这种算法相关于取模模式也有一个毛病:当server数量很少时,很或者他们在环中的散布不是特意平均,进而造成cache不能平均散布到一切的server上。
如图,一共有3台server – 1,2,4。
命中4的几率远远高于1和2。
为处置这个疑问,须要经常使用虚构节点的思维:为每个物理节点(server)在环上调配100~200个点,这样环上的节点较多,就能克服散布不平均。
当为cache定位指标server时,假设定位到虚构节点上,就示意cache真正的存储位置是在该虚构节点代表的实践物理server上。
另外,假设每个实践server的负载才干不同,可以赋予不同的权重,依据权重调配不同数量的虚构节点。
// 驳回有序map来模拟环 = new TreeMap();MessageDigest md5 = ();//用MD5来计算key和server的hash值 // 计算总权重 if ( for ( int i = 0; i < ; i++ ) += ( [i] == null ) ? 1 : [i];} else if ( == null ) { = ;}// 为每个server调配虚构节点 for ( int i = 0; i < ; i++ ) {// 计算以后server的权重 int thisWeight = 1;if ( != null && [i] != null )thisWeight = [i];// factor用来管理每个server调配的虚构节点数量 // 权重都相反时,factor=40 // 权重不同时,factor=40*server总数*该server权重所占的百分比 // 总的来说,权重越大,factor越大,可以调配越多的虚构节点 double factor = ( ((double)(40 * * thisWeight)) / (double) );for ( long j = 0; j < factor; j++ ) {// 每个server有factor个hash值 // 经常使用server的域名或IP加上编号来计算hash值 // 比如server - 172.45.155.25就有factor个数据用来生成hash值: // 172.45.155.25-1, 172.45.155.25-2, ..., 172.45.155.25-factor byte[] d = ( ( servers[i] + - + j )() );// 每个hash值生成4个虚构节点 for ( int h = 0 ; h < 4; h++ ) {Long k =((long)(d[3+h*4]&0xFF) << 24)| ((long)(d[2+h*4]&0xFF) << 16)| ((long)(d[1+h*4]&0xFF) << 8 )| ((long)(d[0+h*4]&0xFF));// 在环上保留节点 ( k, servers[i] );}}// 每个server一共调配4*factor个虚构节点 }// 驳回有序map来模拟环 = new TreeMap();MessageDigest md5 = ();//用MD5来计算key和server的hash值// 计算总权重if ( ( int i = 0; i < ; i++ ) += ( [i] == null ) ? 1 : [i];} else if ( == null ) { = ;}// 为每个server调配虚构节点for ( int i = 0; i < ; i++ ) {// 计算以后server的权重int thisWeight = 1;if ( != null && [i] != null )thisWeight = [i];// factor用来管理每个server调配的虚构节点数量// 权重都相反时,factor=40// 权重不同时,factor=40*server总数*该server权重所占的百分比// 总的来说,权重越大,factor越大,可以调配越多的虚构节点double factor = ( ((double)(40 * * thisWeight)) / (double) );for ( long j = 0; j < factor; j++ ) {// 每个server有factor个hash值// 经常使用server的域名或IP加上编号来计算hash值// 比如server - 172.45.155.25就有factor个数据用来生成hash值:// 172.45.155.25-1, 172.45.155.25-2, ..., 172.45.155.25-factorbyte[] d = ( ( servers[i] + - + j )() );// 每个hash值生成4个虚构节点for ( int h = 0 ; h < 4; h++ ) {Long k =((long)(d[3+h*4]&0xFF) << 24)| ((long)(d[2+h*4]&0xFF) << 16)| ((long)(d[1+h*4]&0xFF) << 8 )| ((long)(d[0+h*4]&0xFF));// 在环上保留节点( k, servers[i] );}}// 每个server一共调配4*factor个虚构节点}// 用MD5来计算key的hash值 MessageDigest md5 = ();();( () );byte[] bKey = ();// 取MD5值的低32位作为key的hash值 long hv = ((long)(bKey[3]&0xFF) << 24) | ((long)(bKey[2]&0xFF) << 16) | ((long)(bKey[1]&0xFF) << 8 ) | (long)(bKey[0]&0xFF);// hv的tailMap的第一个虚构节点对应的即是指标server SortedMap tmap = ( hv );return ( () ) ? () : ();更多疑问到疑问求助专区()