memcached性能(PHP中4个加速,缓存扩展的区别和选用建议)

2025-09-08 08:45:01 0

memcached性能(PHP中4个加速,缓存扩展的区别和选用建议)

大家好,关于memcached性能很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于PHP中4个加速,缓存扩展的区别和选用建议的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

本文目录

PHP中4个加速,缓存扩展的区别和选用建议

  1、eAccelerator
  eAccelerator是一个自由开放源码PHP加速器,优化和动态内容缓存,提高了PHP脚本的缓存性能,使得PHP脚本在编译的状态下,对服务器的开销几乎完全消除。 它还有对脚本起优化作用,以加快其执行效率。使PHP程序代码执效率能提高1-10倍。从文字上可以理解为:eAccelerator是PHP加速器扩展。
  2、memcached
  Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。从文字上可以理解为:内存缓存扩展,并且针对于集群服务器使用较多,主要用于分布式缓存,算是数据库缓存。
  3、Alternative PHP Cache(APC缓存)
  Alternative PHP Cache (APC缓存)是一种对PHP有效的开放源高速缓冲储存器工具,他能够缓存Opcode(目标文件)的PHP中间码。 APC的缓存分两部分:系统缓存和用户数据缓存. 系统缓存 是自动使用的,是指APC把PHP文件源码的编译结果缓存起来,然后在再次调用时先对比时间标记。如果未过期,则使用缓存代码运行。默认缓存 3600s(一小时).但是这样仍会浪费大量CPU时间.因此可以在php.ini中设置system缓存为永不过期(apc.ttl=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这个组合。

win7系统安装memcached的详细步骤(图文)


本教程小编和大家分享win7系统安装memcached的方法,许多小伙伴不知道如何安装memcached,Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。接下来教程分享win7系统安装memcached的详细步骤。
推荐:win764位系统下载
具体方法如下:
1、软件包下载;
安装步骤
1、解压到指定目录,如:E:\memcached;
2、用cmd打开命令窗口,转到解压的目录,输入“memcached-dinstall”;
3、查看是否安装成功,输入memcached_h,出现下图窗口说明已经安装成功;
4、默认参数说明
-p监听的端口
-l连接的IP地址,默认是本机
-dstart启动memcached服务
-drestart重起memcached服务
-dstop|shutdown关闭正在运行的memcached服务
-dinstall安装memcached服务
-duninstall卸载memcached服
-u以的身份运行(仅在以root运行的时候有效
-m最大内存使用,单位MB。默认64M
-M内存耗尽时返回错误,而不是删除
-c最大同时连接数,默认是102
-f块大小增长因子,默认是1.2
-n最小分配空间,key+value+flags默认是4
-h显示帮助
5、telnet测试是否正常运行telnet127.0.0.111211;
6、进入后先按ctrl+]启动回示功能,否则无法看到输入信息。回示功能启动成功后;
7、stats命令查看运行状态;
8、注意:如果提示telnet命令不存在,需要去控件面板开启windows的tel服务功能,win7的开启tel功能操作步骤是:【控制面板】-【程序和功能】-【打开或关闭window功能】,然后找到并勾选tel相关即可。
本教程分享win7系统安装memcached的方法。

PHP应用中常用的9大缓存技术

一、全页面静态化缓存

也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程。此种方式,在CMS系统中比较常见,比如dedecms;

一种比较常用的实现方式是用输出缓存:

Ob_start()******要运行的代码*******$content=Ob_get_contents();****将缓存内容写入html文件*****Ob_end_clean();

二、数据缓存

顾名思义,就是缓存数据的一种方式;比如,商城中的某个商品信息,当用商品id去请求时,就会得出包括店铺信息、商品信息等数据,此时就可以将这些数据缓存到一个php文件中,文件名包含商品id来建一个唯一标示;下一次有人想查看这个商品时,首先就直接调这个文件里面的信息,而不用再去数据库查询;其实缓存文件中缓存的就是一个php数组之类;

Ecmall商城系统里面就用了这种方式;

三、查询缓存

其实这跟数据缓存是一个思路,就是根据查询语句来缓存;将查询得到的数据缓存在一个文件中,下次遇到相同的查询时,就直接先从这个文件里面调数据,不会再去查数据库;但此处的缓存文件名可能就需要以查询语句为基点来建立唯一标示;

按时间变更进行缓存

就是对于缓存文件您需要设一个有效时间,在这个有效时间内,相同的访问才会先取缓存文件的内容,但是超过设定的缓存时间,就需要重新从数据库中获取数据,并生产最新的缓存文件;比如,我将我们商城的首页就是设置2个小时更新一次。

四、页面部分缓存

该种方式,是将一个页面中不经常变的部分进行静态缓存,而经常变化的块不缓存,最后组装在一起显示;可以使用类似于ob_get_contents的方式实现,也可以利用类似ESI之类的页面片段缓存策略,使其用来做动态页面中相对静态的片段部分的缓存。

该种方式可以用于如商城中的商品页;

五、Opcode缓存

首先php代码被解析为Tokens,然后再编译为Opcode码,最后执行Opcode码,返回结果;所以,对于相同的php文件,第一次运行时可以缓存其Opcode码,下次再执行这个页面时,直接会去找到缓存下的opcode码,直接执行最后一步,而不再需要中间的步骤了。

比较知名的是XCache、TurckMMCache、PHPAccelerator等。

六、按内容变更进行缓存

这个也并非独立的缓存技术,需结合着用;就是当数据库内容被修改时,即刻更新缓存文件;

比如,一个人流量很大的商城,商品很多,商品表必然比较大,这表的压力也比较重;我们就可以对商品显示页进行页面缓存;

当商家在后台修改这个商品的信息时,点击保存,我们同时就更新缓存文件;那么,买家访问这个商品信息时,实际问的是一个静态页面,而不需要再去访问数据库;

试想,如果对商品页不缓存,那么每次访问一个商品就要去数据库查一次,如果有10万人在线浏览商品,那服务器压力就大了;

七、内存式缓存

提到这个,可能大家想到的首先就是Memcached;memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

它就是将需要缓存的信息,缓存到系统内存中,需要获取信息时,直接到内存中取;比较常用的方式就是key_》value方式;

connect($memcachehost,$memcacheport)ordie("Couldnotconnect");$memcache-》set(’key’,’缓存的内容’);$get=$memcache-》get($key);//获取信息?》

八、apache缓存模块

apache安装完以后,是不允许被cache的。昌平镇IT培训认为如果外接了cache或squid服务器要求进行web加速的话,就需要在htttpd.conf里进行设置,当然前提是在安装apache的时候要激活mod_cache的模块。

Memcached真的过时了吗

这两年 Redis火得可以,Redis也常常被当作 Memcached的挑战者被提到桌面上来。关于Redis与Memcached的比较更是比比皆是。然而,Redis真的在功能、性能以及内存使用效率上都超越了Memcached吗?
没有必要过于关注性能,因为二者的性能都已经足够高了。由于Redis只使用单核,而Memcached可以使用多核,所以二者比较起来,平均每一个核上,Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis。虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。说了这么多,结论是,无论你使用哪一个,每秒处理请求的次数都不会成为瓶颈。
在内存使用效率上,如果使用简单的key-value存储,Memcached的内存利用率更高。而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。当然,这和你的应用场景和数据特性有关。
如果你对数据持久化和数据同步有所要求,那么推荐你选择Redis。因为这两个特性Memcached都不具备。即使你只是希望在升级或者重启系统后缓存数据不会丢失,选择Redis也是明智的。
当然,最后还得说到你的具体应用需求。Redis相比Memcached来说,拥有更多的数据结构,并支持更丰富的数据操作。通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果你需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。

.Net的Cache和Memcached有什么优缺点

如果你的服务器只有一台,且数据库读写压力不大,就没必要使用Memcached。HttpRuntime.Cache是本地缓存,Memcached是分布式缓存,两者的区别在于:
本地缓存
本地缓存可能是大家用的最多的一种缓存方式了,不管是本地内存还是磁盘,其速度快,成本低,在有些场合非常有效。
但是对于web系统的集群负载均衡结构来说,本地缓存使用起来就比较受限制,因为当数据库数据发生变化时,你没有一个简单有效的方法去更新本地缓存;然而,你如果在不同的服务器之间去同步本地缓存信息,由于缓存的低时效性和高访问量的影响,其成本和性能恐怕都是难以接受的。
分布式缓存
前面提到过,本地缓存的使用很容易让你的应用服务器带上“状态”,这种情况下,数据同步的开销09会比较大;尤其是在集群环境中更是如此!
分布式缓存这种东西存在的目的就是为了提供比RDB更高的TPS和扩展性,同时有帮你承担了数据同步的痛苦;优秀的分布式缓存系统有大家所熟知的Memcached、Redis(当然也许你把它看成是NoSQL,但是我个人更愿意把分布式缓存也看成是NoSQL),还有淘宝自主开发的Tair等。
对比关系型数据库和缓存存储,其在读和写性能上的差距可谓天壤之别;就拿淘宝的Tair来说,mdb引擎的单机QPS已在10w以上,ldb的也达到了5w~7w,而集群的性能会更高(目前uic所用的Tair集群QPS高达数十万!)。
所以,在技术和业务都可以接受的情况下,我们可以尽量把读写压力从数据库转移到缓存上,以保护看似强大,其实却很脆弱的关系型数据库。

如何提高数据库性能


MyISAM参数默认值:
key_buffer_size = 16M
#索引缓存区大小,一般设置物理内存的30-40%
read_buffer_size = 128K
#读操作缓冲区大小,推荐设置16M或32M
InnoDB参数默认值:
innodb_buffer_pool_size = 128M
#索引和数据缓冲区大小,一般设置物理内存的60%-70%
innodb_buffer_pool_instances = 1
#缓冲池实例个数,推荐设置4个或8个
innodb_flush_log_at_trx_commit = 1
#关键参数,0代表大约每秒写入到日志并同步到磁盘,数据库故障会丢失1秒左右事务数据。1为每执行一条SQL后写入到日志并同步到磁盘,I/O开销大,执行完SQL要等待日志读写,效率低。2代表只把日志写入到系统缓存区,再每秒同步到磁盘,效率很高,如果服务器故障,才会丢失事务数据。对数据安全性要求不是很高的推荐设置2,性能高,修改后效果明显。
innodb_file_per_table = OFF
#默认是共享表空间,共享表空间idbdata文件不断增大,影响一定的I/O性能。推荐开启独立表空间模式,每个表的索引和数据都存在自己独立的表空间中,可以实现单表在不同数据库中移动。
innodb_log_buffer_size = 8M
#日志缓冲区大小,由于日志最长每秒钟刷新一次,所以一般不用超过16M
3.2 系统内核优化
大多数MySQL都部署在linux系统上,所以操作系统的一些参数也会影响到MySQL性能,以下对linux内核进行适当优化。
net.ipv4.tcp_fin_timeout = 30
#TIME_WAIT超时时间,默认是60s
net.ipv4.tcp_tw_reuse = 1
#1表示开启复用,允许TIME_WAIT socket重新用于新的TCP连接,0表示关闭
net.ipv4.tcp_tw_recycle = 1
#1表示开启TIME_WAIT socket快速回收,0表示关闭
net.ipv4.tcp_max_tw_buckets = 4096
#系统保持TIME_WAIT socket最大数量,如果超出这个数,系统将随机清除一些TIME_WAIT并打印警告信息
net.ipv4.tcp_max_syn_backlog = 4096
#进入SYN队列最大长度,加大队列长度可容纳更多的等待连接
在linux系统中,如果进程打开的文件句柄数量超过系统默认值1024,就会提示“too many files open”信息,所以要调整打开文件句柄限制。
# vi /etc/security/limits.conf #加入以下配置,*代表所有用户,也可以指定用户,重启系统生效
* soft nofile 65535
* hard nofile 65535
# ulimit -SHn 65535#立刻生效
3.3 硬件配置
加大物理内存,提高文件系统性能。linux内核会从内存中分配出缓存区(系统缓存和数据缓存)来存放热数据,通过文件系统延迟写入机制,等满足条件时(如缓存区大小到达一定百分比或者执行sync命令)才会同步到磁盘。也就是说物理内存越大,分配缓存区越大,缓存数据越多。当然,服务器故障会丢失一定的缓存数据。
SSD硬盘代替SAS硬盘,将RAID级别调整为RAID1+0,相对于RAID1和RAID5有更好的读写性能(IOPS),毕竟数据库的压力主要来自磁盘I/O方面。
4、数据库架构扩展
随着业务量越来越大,单台数据库服务器性能已无法满足业务需求,该考虑加机器了,该做集群了~~~。主要思想是分解单台数据库负载,突破磁盘I/O性能,热数据存放缓存中,降低磁盘I/O访问频率。
4.1 主从复制与读写分离
因为生产环境中,数据库大多都是读操作,所以部署一主多从架构,主数据库负责写操作,并做双击热备,多台从数据库做负载均衡,负责读操作,主流的负载均衡器有LVS、HAProxy、Nginx。
怎么来实现读写分离呢?大多数企业是在代码层面实现读写分离,效率比较高。另一个种方式通过代理程序实现读写分离,企业中应用较少,常见代理程序有MySQL Proxy、Amoeba。在这样数据库集群架构中,大大增加数据库高并发能力,解决单台性能瓶颈问题。如果从数据库一台从库能处理2000 QPS,那么5台就能处理1w QPS,数据库横向扩展性也很容易。
有时,面对大量写操作的应用时,单台写性能达不到业务需求。如果做双主,就会遇到数据库数据不一致现象,产生这个原因是在应用程序不同的用户会有可能操作两台数据库,同时的更新操作造成两台数据库数据库数据发生冲突或者不一致。在单库时MySQL利用存储引擎机制表锁和行锁来保证数据完整性,怎样在多台主库时解决这个问题呢?有一套基于perl语言开发的主从复制管理工具,叫MySQL-MMM(Master-Master replication managerfor Mysql,Mysql主主复制管理器),这个工具最大的优点是在同一时间只提供一台数据库写操作,有效保证数据一致性。
***隐藏网址***
***隐藏网址***
***隐藏网址***
4.2 增加缓存
给数据库增加缓存系统,把热数据缓存到内存中,如果缓存中有要请求的数据就不再去数据库中返回结果,提高读性能。缓存实现有本地缓存和分布式缓存,本地缓存是将数据缓存到本地服务器内存中或者文件中。分布式缓存可以缓存海量数据,扩展性好,主流的分布式缓存系统有memcached、redis,memcached性能稳定,数据缓存在内存中,速度很快,QPS可达8w左右。如果想数据持久化就选择用redis,性能不低于memcached。
工作过程:
4.3 分库
分库是根据业务不同把相关的表切分到不同的数据库中,比如web、bbs、blog等库。如果业务量很大,还可将切分后的库做主从架构,进一步避免单个库压力过大。
4.4 分表
数据量的日剧增加,数据库中某个表有几百万条数据,导致查询和插入耗时太长,怎么能解决单表压力呢?你就该考虑是否把这个表拆分成多个小表,来减轻单个表的压力,提高处理效率,此方式称为分表。
分表技术比较麻烦,要修改程序代码里的SQL语句,还要手动去创建其他表,也可以用merge存储引擎实现分表,相对简单许多。分表后,程序是对一个总表进行操作,这个总表不存放数据,只有一些分表的关系,以及更新数据的方式,总表会根据不同的查询,将压力分到不同的小表上,因此提高并发能力和磁盘I/O性能。
分表分为垂直拆分和水平拆分:
垂直拆分:把原来的一个很多字段的表拆分多个表,解决表的宽度问题。你可以把不常用的字段单独放到一个表中,也可以把大字段独立放一个表中,或者把关联密切的字段放一个表中。
水平拆分:把原来一个表拆分成多个表,每个表的结构都一样,解决单表数据量大的问题。
4.5 分区
分区就是把一张表的数据根据表结构中的字段(如range、list、hash等)分成多个区块,这些区块可以在一个磁盘上,也可以在不同的磁盘上,分区后,表面上还是一张表,但数据散列在多个位置,这样一来,多块硬盘同时处理不同的请求,从而提高磁盘I/O读写性能,实现比较简单。
注:增加缓存、分库、分表和分区主要由程序猿来实现。
5、数据库维护
数据库维护是运维工程师或者DBA主要工作,包括性能监控、性能分析、性能调优、数据库备份和恢复等。
5.1 性能状态关键指标
QPS,Queries Per Second:每秒查询数,一台数据库每秒能够处理的查询次数
TPS,Transactions Per Second:每秒处理事务数
通过show status查看运行状态,会有300多条状态信息记录,其中有几个值帮可以我们计算出QPS和TPS,如下:
Uptime:服务器已经运行的实际,单位秒
Questions:已经发送给数据库查询数
Com_select:查询次数,实际操作数据库的
Com_insert:插入次数
Com_delete:删除次数
Com_update:更新次数
Com_commit:事务次数
Com_rollback:回滚次数
那么,计算方法来了,基于Questions计算出QPS:
mysql》 show global status like ‘Questions‘;
mysql》 show global status like ‘Uptime‘;
QPS = Questions / Uptime
基于Com_commit和Com_rollback计算出TPS:
mysql》 show global status like ‘Com_commit‘;
mysql》 show global status like ‘Com_rollback‘;
mysql》 show global status like ‘Uptime‘;
TPS = (Com_commit + Com_rollback) / Uptime
另一计算方式:基于Com_select、Com_insert、Com_delete、Com_update计算出QPS
mysql》 show global status where Variable_name in(‘com_select‘,‘com_insert‘,‘com_delete‘,‘com_update‘);
等待1秒再执行,获取间隔差值,第二次每个变量值减去第一次对应的变量值,就是QPS
TPS计算方法:
mysql》 show global status where Variable_name in(‘com_insert‘,‘com_delete‘,‘com_update‘);
计算TPS,就不算查询操作了,计算出插入、删除、更新四个值即可。
经网友对这两个计算方式的测试得出,当数据库中myisam表比较多时,使用Questions计算比较准确。当数据库中innodb表比较多时,则以Com_*计算比较准确。
5.2 开启慢查询日志
MySQL开启慢查询日志,分析出哪条SQL语句比较慢,使用set设置变量,重启服务失效,可以在my.cnf添加参数永久生效。
mysql》 set global slow-query-log=on #开启慢查询功能
mysql》 set global slow_query_log_file=‘/var/log/mysql/mysql-slow.log‘; #指定慢查询日志文件位置
mysql》 set global log_queries_not_using_indexes=on;#记录没有使用索引的查询
mysql》 set global long_query_time=1;#只记录处理时间1s以上的慢查询
分析慢查询日志,可以使用MySQL自带的mysqldumpslow工具,分析的日志较为简单。
# mysqldumpslow -t 3 /var/log/mysql/mysql-slow.log #查看最慢的前三个查询
也可以使用percona公司的pt-query-digest工具,日志分析功能全面,可分析slow log、binlog、general log。
分析慢查询日志:pt-query-digest /var/log/mysql/mysql-slow.log
分析binlog日志:mysqlbinlog mysql-bin.000001 》mysql-bin.000001.sql
pt-query-digest --type=binlog mysql-bin.000001.sql
分析普通日志:pt-query-digest --type=genlog localhost.log
5.3 数据库备份
备份数据库是最基本的工作,也是最重要的,否则后果很严重,你懂得!但由于数据库比较大,上百G,往往备份都很耗费时间,所以就该选择一个效率高的备份策略,对于数据量大的数据库,一般都采用增量备份。常用的备份工具有mysqldump、mysqlhotcopy、xtrabackup等,mysqldump比较适用于小的数据库,因为是逻辑备份,所以备份和恢复耗时都比较长。mysqlhotcopy和xtrabackup是物理备份,备份和恢复速度快,不影响数据库服务情况下进行热拷贝,建议使用xtrabackup,支持增量备份。
***隐藏网址***
5.4 数据库修复
有时候MySQL服务器突然断电、异常关闭,会导致表损坏,无法读取表数据。这时就可以用到MySQL自带的两个工具进行修复,myisamchk和mysqlcheck。
myisamchk:只能修复myisam表,需要停止数据库
常用参数:
-f --force 强制修复,覆盖老的临时文件,一般不使用
-r --recover 恢复模式
-q --quik 快速恢复
-a --analyze 分析表
-o --safe-recover 老的恢复模式,如果-r无法修复,可以使用此参数试试
-F --fast 只检查没有正常关闭的表
快速修复weibo数据库:
# cd /var/lib/mysql/weibo
# myisamchk -r -q *.MYI
mysqlcheck:myisam和innodb表都可以用,不需要停止数据库,如修复单个表,可在数据库后面添加表名,以空格分割
常用参数:
-a --all-databases 检查所有的库
-r --repair 修复表
-c --check 检查表,默认选项
-a --analyze 分析表
-o --optimize 优化表
-q --quik 最快检查或修复表
-F --fast 只检查没有正常关闭的表
快速修复weibo数据库:
mysqlcheck -r -q -uroot -p123 weibo
5.5 另外,查看CPU和I/O性能方法
#查看CPU性能
#参数-P是显示CPU数,ALL为所有,也可以只显示第几颗CPU
#查看I/O性能
#参数-m是以M单位显示,默认K
#%util:当达到100%时,说明I/O很忙。
#await:请求在队列中等待时间,直接影响read时间。
I/O极限:IOPS(r/s+w/s),一般RAID0/10在1200左右。(IOPS,每秒进行读写(I/O)操作次数)
I/O带宽:在顺序读写模式下SAS硬盘理论值在300M/s左右,SSD硬盘理论值在600M/s左右。
以上是本人使用MySQL三年来总结的一些主要优化方案,能力有限,有些不太全面,但这些基本能够满足中小型企业数据库需求。
由于关系型数据库初衷设计限制,一些BAT公司海量数据放到关系型数据库中,在海量数据查询和分析方面已经达不到更好的性能。因此NoSQL火起来了,非关系型数据库,大数据量,具有高性能,同时也弥补了关系型数据库某方面不足,渐渐大多数公司已经将部分业务数据库存放到NoSQL中,如MongoDB、HBase等。数据存储方面采用分布式文件系统,如HDFS、GFS等。海量数据计算分析采用Hadoop、Spark、Storm等。这些都是与运维相关的前沿技术,也是在存储方面主要学习对象,小伙伴们共同加油吧!哪位博友有更好的优化方案,欢迎交流哦。
如何提高数据库性能
标签:raid5tps级别gesmysql部署创建信息inno扩展







利用memcached构建高性能的Web应用程序

  面临的问题

  对于高并发高访问的Web应用程序来说 数据库存取瓶颈一直是个令人头疼的问题 特别当你的程序架构还是建立在单数据库模式 而一个数据池连接数峰值已经达到 的时候 那你的程序运行离崩溃的边缘也不远了 很多小网站的开发人员一开始都将注意力放在了产品需求设计上 缺忽视了程序整体性能 可扩展性等方面的考虑 结果眼看着访问量一天天网上爬 可突然发现有一天网站因为访问量过大而崩溃了 到时候哭都来不及 所以我们一定要未雨绸缪 在数据库还没罢工前 想方设法给它减负 这也是这篇文章的主要议题

  大家都知道 当有一个request过来后 web服务器交给app服务器 app处理并从db中存取相关数据 但db存取的花费是相当高昂的 特别是每次都取相同的数据 等于是让数据库每次都在做高耗费的无用功 数据库如果会说话 肯定会发牢骚 你都问了这么多遍了 难道还记不住吗?是啊 如果app拿到第一次数据并存到内存里 下次读取时直接从内存里读取 而不用麻烦数据库 这样不就给数据库减负了?而且从内存取数据必然要比从数据库媒介取快很多倍 反而提升了应用程序的性能

  因此 我们可以在web/app层与db层之间加一层cache层 主要目的 减少数据库读取负担 提高数据读取速度 而且 cache存取的媒介是内存 而一台服务器的内存容量一般都是有限制的 不像硬盘容量可以做到TB级别 所以 可以考虑采用分布式的cache层 这样更易于破除内存容量的限制 同时又增加了灵活性

  Memcached 介绍

  Memcached是开源的分布式cache系统 现在很多的大型web应用程序包括facebook youtube wikipedia yahoo等等都在使用memcached来支持他们每天数亿级的页面访问 通过把cache层与他们的web架构集成 他们的应用程序在提高了性能的同时 还大大降低了数据库的负载

  具体的memcached资料大家可以直接从它的官方网站上得到 这里我就简单给大家介绍一下memcached的工作原理

  Memcached处理的原子是每一个(key value)对(以下简称kv对) key会通过一个hash算法转化成hash key 便于查找 对比以及做到尽可能的散列 同时 memcached用的是一个二级散列 通过一张大hash表来维护

  Memcached有两个核心组件组成 服务端(ms)和客户端(mc) 在一个memcached的查询中 mc先通过计算key的hash值来确定kv对所处在的ms位置 当ms确定后 客户端就会发送一个查询请求给对应的ms 让它来查找确切的数据 因为这之间没有交互以及多播协议 所以memcached交互带给网络的影响是最小化的

  举例说明 考虑以下这个场景 有三个mc分别是X Y Z 还有三个ms分别是A B C

  设置kv对

  X想设置key= foo value= seattle

  X拿到ms列表 并对key做hash转化 根据hash值确定kv对所存的ms位置

  B被选中了

  X连接上B B收到请求 把(key= foo value= seattle )存了起来

  获取kv对

  Z想得到key= foo 的value

  Z用相同的hash算法算出hash值 并确定key= foo 的值存在B上

  Z连接上B 并从B那边得到value= seattle

  其他任何从X Y Z的想得到key= foo 的值的请求都会发向B

  Memcached服务器(ms)

  内存分配

  默认情况下 ms是用一个内置的叫 块分配器 的组件来分配内存的 舍弃c++标准的malloc/free的内存分配 而采用块分配器的主要目的是为了避免内存碎片 否则操作系统要花费更多时间来查找这些逻辑上连续的内存块(实际上是断开的) 用了块分配器 ms会轮流的对内存进行大块的分配 并不断重用 当然由于块的大小各不相同 当数据大小和块大小不太相符的情况下 还是有可能导致内存的浪费

  同时 ms对key和data都有相应的限制 key的长度不能超过 字节 data也不能超过块大小的限制 MB

  因为mc所使用的hash算法 并不会考虑到每个ms的内存大小 理论上mc会分配概率上等量的kv对给每个ms 这样如果每个ms的内存都不太一样 那可能会导致内存使用率的降低 所以一种替代的解决方案是 根据每个ms的内存大小 找出他们的最大公约数 然后在每个ms上开n个容量=最大公约数的instance 这样就等于拥有了多个容量大小一样的子ms 从而提供整体的内存使用率

  缓存策略

  当ms的hash表满了之后 新的插入数据会替代老的数据 更新的策略是LRU(最近最少使用) 以及每个kv对的有效时限 Kv对存储有效时限是在mc端由app设置并作为参数传给ms的

  同时ms采用是偷懒替代法 ms不会开额外的进程来实时监测过时的kv对并删除 而是当且仅当 新来一个插入的数据 而此时又没有多余的空间放了 才会进行清除动作

  缓存数据库查询

  现在memcached最流行的一种使用方式是缓存数据库查询 下面举一个简单例子说明

  App需要得到userid=xxx的用户信息 对应的查询语句类似

   SELECT * FROM users WHERE userid = xxx

  App先去问cache 有没有 user:userid (key定义可预先定义约束好)的数据 如果有 返回数据 如果没有 App会从数据库中读取数据 并调用cache的add函数 把数据加入cache中

  当取的数据需要更新 app会调用cache的update函数 来保持数据库与cache的数据同步

  从上面的例子我们也可以发现 一旦数据库的数据发现变化 我们一定要及时更新cache中的数据 来保证app读到的是同步的正确数据 当然我们可以通过定时器方式记录下cache中数据的失效时间 时间一过就会激发事件对cache进行更新 但这之间总会有时间上的延迟 导致app可能从cache读到脏数据 这也被称为狗洞问题 (以后我会专门描述研究这个问题)

  数据冗余与故障预防

  从设计角度上 memcached是没有数据冗余环节的 它本身就是一个大规模的高性能cache层 加入数据冗余所能带来的只有设计的复杂性和提高系统的开支

  当一个ms上丢失了数据之后 app还是可以从数据库中取得数据 不过更谨慎的做法是在某些ms不能正常工作时 提供额外的ms来支持cache 这样就不会因为app从cache中取不到数据而一下子给数据库带来过大的负载

  同时为了减少某台ms故障所带来的影响 可以使用 热备份 方案 就是用一台新的ms来取代有问题的ms 当然新的ms还是要用原来ms的IP地址 大不了数据重新装载一遍

  另外一种方式 就是提高你ms的节点数 然后mc会实时侦查每个节点的状态 如果发现某个节点长时间没有响应 就会从mc的可用server列表里删除 并对server节点进行重新hash定位 当然这样也会造成的问题是 原本key存储在B上 变成存储在C上了 所以此方案本身也有其弱点 最好能和 热备份 方案结合使用 就可以使故障造成的影响最小化

  Memcached客户端(mc)

  Memcached客户端有各种语言的版本供大家使用 包括java c 等等 具体可参见memcached api page

  大家可以根据自己项目的需要 选择合适的客户端来集成

  缓存式的Web应用程序架构

  有了缓存的支持 我们可以在传统的app层和db层之间加入cache层 每个app服务器都可以绑定一个mc 每次数据的读取都可以从ms中取得 如果没有 再从db层读取 而当数据要进行更新时 除了要发送update的sql给db层 同时也要将更新的数据发给mc 让mc去更新ms中的数据

  假设今后我们的数据库可以和ms进行通讯了 那可以将更新的任务统一交给db层 每次数据库更新数据的同时会自动去更新ms中的数据 这样就可以进一步减少app层的逻辑复杂度 如下图

  不过每次我们如果没有从cache读到数据 都不得不麻烦数据库 为了最小化数据库的负载压力 我们可以部署数据库复写 用slave数据库来完成读取操作 而master数据库永远只负责三件事 更新数据 同步slave数据库 更新cache 如下图

  以上这些缓存式web架构在实际应用中被证明是能有效并能极大地降低数据库的负载同时又能提高web的运行性能 当然这些架构还可以根据具体的应用环境进行变种 以达到不同硬件条件下性能的最优化

  未来的憧憬

  Memcached的出现可以说是革命性的 第一次让我们意识到可以用内存作为存储媒介来大规模的缓存数据以提高程序的性能 不过它毕竟还是比较新的东西 还需要很多有待优化和改进的地方 例如

  如何利用memcached实现cache数据库 让数据库跑在内存上 这方面 tangent sofare 开发的memcached_engine已经做了不少工作 不过现在的版本还只是处于实验室阶段

lishixinzhi/Article/program/net/201311/12995

缓存系统中的主要使用的数据结构是什么

缓存系统中的主要使用的数据结构是memcached。

memcached是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但被许多网站使用。这是一套开放源代码软件,以BSD license授权发布。

memcached的API使用三十二比特的循环冗余校验(CRC-32)计算键值后,将数据分散在不同的机器上。当表格满了以后,接下来新增的数据会以LRU机制替换掉。

由于memcached通常只是当作缓存系统使用,所以使用memcached的应用程序在写回较慢的系统时(像是后端的数据库)需要额外的代码更新memcached内的数据。

扩展资料:

一、存储方式

为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。

另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

二、通信分布式

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

以上就是我们为大家找到的有关“memcached性能(PHP中4个加速,缓存扩展的区别和选用建议)”的所有内容了,希望可以帮助到你。如果对我们网站的其他内容感兴趣请持续关注本站。

memcached性能(PHP中4个加速,缓存扩展的区别和选用建议)

本文编辑:admin

更多文章:


wordpress和自己写(开发企业网站 是用现成的开源框架(如wordpress等)还是自己独立写 哪种比较好一些)

wordpress和自己写(开发企业网站 是用现成的开源框架(如wordpress等)还是自己独立写 哪种比较好一些)

其实wordpress和自己写的问题并不复杂,但是又很多的朋友都不太了解开发企业网站 是用现成的开源框架(如wordpress等)还是自己独立写 哪种比较好一些,因此呢,今天小编就来为大家分享wordpress和自己写的一些知识,希望可以帮

2025年12月25日 14:00

edate函数(excel edate函数怎么用)

edate函数(excel edate函数怎么用)

各位老铁们,大家好,今天由我来为大家分享edate函数,以及excel edate函数怎么用的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录exce

2025年7月23日 09:00

链表排序c++代码(单链表递增次序进行排序用c++实现)

链表排序c++代码(单链表递增次序进行排序用c++实现)

大家好,链表排序c++代码相信很多的网友都不是很明白,包括单链表递增次序进行排序用c++实现也是一样,不过没有关系,接下来就来为大家分享关于链表排序c++代码和单链表递增次序进行排序用c++实现的一些知识点,大家可以关注收藏,免得下次来找不

2026年2月23日 05:45

java代码提示(用myeclipse,在jsp中写java代码,需要导包时不提示,必须手动导包,怎样才能让它提示并且自动导包)

java代码提示(用myeclipse,在jsp中写java代码,需要导包时不提示,必须手动导包,怎样才能让它提示并且自动导包)

各位老铁们好,相信很多人对java代码提示都不是特别的了解,因此呢,今天就来为大家分享下关于java代码提示以及用myeclipse,在jsp中写java代码,需要导包时不提示,必须手动导包,怎样才能让它提示并且自动导包的问题知识,还望可以

2026年4月9日 13:15

配置管理工具哪个最好(公司项目管理软件哪些是比较好用的)

配置管理工具哪个最好(公司项目管理软件哪些是比较好用的)

今天给各位分享公司项目管理软件哪些是比较好用的的知识,其中也会对公司项目管理软件哪些是比较好用的进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录公司项目管理软件哪些是比较好用的市面上那么多的项目管理工具,该怎么

2026年1月26日 06:45

怎样安装tomcat服务(如何安装Apache Tomcat并使用Tomcat发布网站)

怎样安装tomcat服务(如何安装Apache Tomcat并使用Tomcat发布网站)

各位老铁们好,相信很多人对怎样安装tomcat服务都不是特别的了解,因此呢,今天就来为大家分享下关于怎样安装tomcat服务以及如何安装Apache Tomcat并使用Tomcat发布网站的问题知识,还望可以帮助大家,解决大家的一些困惑,下

2025年12月21日 23:30

谁有点卡回收寄售平台的源码最好免费的?虚幻源码卡在加载页面中

谁有点卡回收寄售平台的源码最好免费的?虚幻源码卡在加载页面中

这篇文章给大家聊聊关于卡论坛源码,以及谁有点卡回收寄售平台的源码最好免费的对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录谁有点卡回收寄售平台的源码最好免费的虚幻源码卡在加载页面中卡巴扫描提示(加密脚本,欢迎来破解我的源代码.

2026年7月20日 05:00

函数指针类型别名(typedef 函数指针 比如typedef char*(*callback)(char*, int);)

函数指针类型别名(typedef 函数指针 比如typedef char*(*callback)(char*, int);)

本篇文章给大家谈谈函数指针类型别名,以及typedef 函数指针 比如typedef char*(*callback)(char*, int);对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录typedef 函数指针 比如ty

2025年6月5日 09:00

css下载文件(下载网页时,如何将css文件中内容全部下载下来)

css下载文件(下载网页时,如何将css文件中内容全部下载下来)

“css下载文件”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看css下载文件(下载网页时,如何将css文件中内容全部下载下来)!本文目录下载网页时,如何将css文件中内容全部下载下来如何下载网页中的CSS文件详细解答哦!下

2026年7月25日 07:00

equip的名词形式怎么写(equip的名词)

equip的名词形式怎么写(equip的名词)

大家好,今天小编来为大家解答以下的问题,关于equip的名词形式怎么写,equip的名词这个很多人还不知道,现在让我们一起来看看吧!本文目录equip的名词游戏用英语怎么写supply用法有provide sth to sb的用法吗游戏里装

2026年1月23日 19:00

餐桌英语怎么读dining table(餐桌英文怎么说)

餐桌英语怎么读dining table(餐桌英文怎么说)

大家好,关于餐桌英语怎么读dining table很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于餐桌英文怎么说的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

2025年10月15日 14:00

数控编程技术是学什么(数控技术是学什么 开设课程有哪些)

数控编程技术是学什么(数控技术是学什么 开设课程有哪些)

这篇文章给大家聊聊关于数控编程技术是学什么,以及数控技术是学什么 开设课程有哪些对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录数控技术是学什么 开设课程有哪些数控编程一般学什么数控专业主要是学什么课程数控技术专业主要是学什么

2025年11月5日 10:15

公司网站建设申请报告(网站建设申请)

公司网站建设申请报告(网站建设申请)

本篇文章给大家谈谈公司网站建设申请报告,以及网站建设申请对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录网站建设申请“关于XXXX购物中心网

2025年10月29日 01:00

css给按钮加箭头(CSS实现带箭头方框怎么控制箭头位置!)

css给按钮加箭头(CSS实现带箭头方框怎么控制箭头位置!)

大家好,今天小编来为大家解答以下的问题,关于css给按钮加箭头,CSS实现带箭头方框怎么控制箭头位置!这个很多人还不知道,现在让我们一起来看看吧!本文目录CSS实现带箭头方框怎么控制箭头位置!如何使用css实现任意大小及任意方向和任意角度的

2026年1月1日 04:30

sql怎么读取excel更新(SQL如何用EXCEL导入一个临时表的相关字段,然后用临时表更新原有的表数据的字段内容)

sql怎么读取excel更新(SQL如何用EXCEL导入一个临时表的相关字段,然后用临时表更新原有的表数据的字段内容)

大家好,今天小编来为大家解答以下的问题,关于sql怎么读取excel更新,SQL如何用EXCEL导入一个临时表的相关字段,然后用临时表更新原有的表数据的字段内容这个很多人还不知道,现在让我们一起来看看吧!本文目录SQL如何用EXCEL导入一

2026年4月25日 09:30

mysql查看视图(MySQL中视图和表的区别与联系)

mysql查看视图(MySQL中视图和表的区别与联系)

本篇文章给大家谈谈mysql查看视图,以及MySQL中视图和表的区别与联系对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录MySQL中视图和表的区别与联系怎么知道mysql 里是表还是视图如何查询SqlServer和MySql

2026年7月9日 03:00

require词根(require acquire enquire 这三个单词怎么区别,有共同的词根么)

require词根(require acquire enquire 这三个单词怎么区别,有共同的词根么)

本篇文章给大家谈谈require词根,以及require acquire enquire 这三个单词怎么区别,有共同的词根么对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问

2025年7月27日 09:00

全球疫情2024年才会结束(全球疫情啥时结束)

全球疫情2024年才会结束(全球疫情啥时结束)

今天给各位分享全球疫情啥时结束的知识,其中也会对全球疫情啥时结束进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录全球疫情啥时结束全球疫情什么时候能结束疫情预测什么时候能结束2024年还会有疫情吗疫情会持续多久全

2025年12月19日 16:45

shell脚本字符串转数字(如何编写一个shell脚本)

shell脚本字符串转数字(如何编写一个shell脚本)

各位老铁们好,相信很多人对shell脚本字符串转数字都不是特别的了解,因此呢,今天就来为大家分享下关于shell脚本字符串转数字以及如何编写一个shell脚本的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录如何编

2025年9月4日 02:45

wallpaper怎么设置鼠标特效(wallpaper控制鼠标灯光)

wallpaper怎么设置鼠标特效(wallpaper控制鼠标灯光)

这篇文章给大家聊聊关于wallpaper怎么设置鼠标特效,以及wallpaper控制鼠标灯光对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录wallpaper控制鼠标灯光wallpaper能改鼠标指针吗Watery Deskt

2026年5月6日 09:45

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索