Memcache简介
memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视 频、文件以及数据库检索的结果等。Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。起初作者编写它可能是为了 提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统, 这种方法不仅解决了共享内存只能是单机的弊端,同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度!基于memcache和对分布式 cache的理解和解决方案。 memcache完全可以用到其他地方 比如分布式数据库, 分布式计算等领域。
接口介绍
Memcache客户端包含两组接口,一组是面向过程的接口,一组是面向对象的接口,具体可以参考PHP手册 “LXXV. Memcache Functions” 这章。
Memcache面向对象的常用接口包括:
Memcache::connect -- 打开一个到Memcache的连接
Memcache::pconnect -- 打开一个到Memcache的长连接
Memcache::close -- 关闭一个Memcache的连接
Memcache::set -- 保存数据到Memcache服务器上
Memcache::get -- 提取一个保存在Memcache服务器上的数据
Memcache::replace -- 替换一个已经存在Memcache服务器上的项目(功能类似Memcache::set)
Memcache::delete -- 从Memcache服务器上删除一个保存的项目
Memcache::flush -- 刷新所有Memcache服务器上保存的项目(类似于删除所有的保存的项目)
Memcache::getStats -- 获取当前Memcache服务器运行的状态
Memcache在中型网站的使用
使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅 速的进行存取。那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台Memcache的内存容量的有限的。我这里简单提出我的个人看法,未 经实践,权当参考。
[ 分布式应用]
Memcache本来支持分布式,我们客户端稍加改造,更好的支持。我们的key可以适当进行 有规律的封装,比如以user为主的网站来说,每个用户都有User ID,那么可以按照固定的ID来进行提取和存取,比如1开头的用户保存在第一台Memcache服务器上,以2开头的用户的数据保存在第二胎 Mecache服务器上,存取数据都先按照User ID来进行相应的转换和存取。
但是这个有缺点,就是需要对User ID进行判断,如果业务不一致,或者其他类型的应用,可能不是那么合适,那么可以根据自己的实际业务来进行考虑,或者去想更合适的方法。
[ 减少数据库压力]
这个算是比较重要的,所有的数据基本上都是保存在数据库当中的,每次频繁的存取数据库,导致数 据库性能极具下降,无法同时服务更多的用户,比如MySQL,特别频繁的锁表,那么让Memcache来分担数据库的压力。我们需要一种改动比较小,并 且能够不会大规模改变前端的方式来进行改变目前的架构。
Memcache的安全
我们上面的Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数 据泄露被其他无关人员查看,重则服务器被入侵,因为Mecache是以root权限运行的,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情 况,这些都是我们未知的,所以危险性是可以预见的。为了安全起见,我做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。
内网访问
最好把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。普遍的服务器都是有两块网卡,一块指向互联网,一块指向内 网,那么就让Web服务器通过内网的网卡来访问Memcache服务器,我们Memcache的服务器上启动的时候就监听内网的IP地址和端口,内网间的 访问能够有效阻止其他非法的访问。
# memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid
Memcache服务器端设置监听通过内网的192.168.0.200的ip的11211端口,占用1024MB内存,并且允许最大1024个并发连接
设置防火墙
防火墙是简单有效的方式,如果却是两台服务器都是挂在网的,并且需要通过外网IP来访问Memcache的话,那么可以考虑使用防火墙或者代理程序来过滤非法访问。
一般我们在Linux下可以使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的访问,比如我们可以设置只允许我们的Web服务器来访问我们Memcache服务器,同时阻止其他的访问。
# iptables -F
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp -s 192.168.0.2 –dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.2 –dport 11211 -j ACCEPT
上面的iptables规则就是只允许192.168.0.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这个可以根据自己的需要来做
Memcache的使用方法:
有两种方法可以使 PHP 作为 memcached 客户端,调用 memcached 的服务进行对象存取操作。
第一种,PHP 有一个叫做 memcache 的扩展,Linux 下编译时需要带上 –enable-memcache[=DIR] 选项,Window 下则在 php.ini 中去掉 php_memcache.dll 前边的注释符,使其可用。
除此之外,还有一种方法,可以避开扩展、重新编译所带来的麻烦,那就是直接使用 php-memcached-client。
建议使用第一种办法,虽然有增加php扩展 重新编译php的麻烦。 但一劳永逸,程序不用再包含一个文件,执行时候不用在通过解析器解析代码。 效率比第二种高很多。
程序应用中需要注意
现在情况是db层和web层之间有一桥梁 memcache程序之间。 但不能因为这而完全中断db 和web之间的联系。 Web 和db之间 要有一个曲线。 即无法使用memecache的时候二者相互通信。
实现很简单:
例如:
$sql="SELECT count(tid) as num FROM pw_blog b WHERE $where";
if(!$memcache->get(md5($sql))){
$count = $db->get_one($sql);
$sum=$count['num'];
$memcache->set(md5($sql), $sum, false, 300000);
}else{
$sum=$memcache->get(md5($sql));
}
而不要写成:
$sql="SELECT count(tid) as num FROM pw_blog b WHERE $where";
if(!$memcache->get(md5($sql))){
$count = $db->get_one($sql);
$sum=$count['num'];
$memcache->set(md5($sql), $sum, false, 300000);
}
$sum=$memcache->get(md5($sql));
这样的形式,这样 db和web就无路可通了。
关于memcache的内存使用
memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。
Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。
Slab Allocation的原理相当简单。 将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合).
memcached根据收到的数据的大小,选择最适合数据大小的slab。 memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。
memcached不会释放已分配的内存。记录超时后,客户端就无法再看见该记录(invisible,透明),其存储空间即可重复使用
memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间
memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当memcached的内存空间不足时(无法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。
此处还有一个参数: M ,不是m
启动时候参数 -m 用来申请内存空间 -M 却是禁止LRU的。
-M 参数使用在内存用慢的时候会返回错误。 本来我们不是把memcached用做存储,而是用做缓存,所以推荐使用LRU。
分享到:
相关推荐
php window memchache下载php window memchache下载php window memchache下载php window memchache下载php window memchache下载php window memchache下载php window memchache下载php window memchache下载...
主要是使用改程序熟悉下memchache缓存 文件列表: Chat.class.php --getChatList() getChatList()方法用的是Php manual上的方法来获取memchache的所有的值,也是处理的核心。当然这种方式还是不推荐使用的。因为ET说...
...Memcache是一款高性能的分布式内存对象缓存系统,它可以用来存储各种数据,如数据库查询结果、静态文件等,以减少对数据库的访问,提高网站性能。... **1.... ...**2....可以在服务管理器中找到Memcache服务,设置为自动启动,...
...that is bundled with this package in the file LICENSE, and is available through the world-wide-web at the following url: ...obtain it through the world-wide-web, please send a note to ...
Memcached 是一个高性能、分布式内存对象缓存系统,它广泛应用于Web应用中,用来减轻数据库负载,提高数据访问速度。Memcached的设计理念是简单而快速,通过在内存中存储键值对来提供高速的数据访问。...
**标题与描述解析** 标题"memcache-demo"指的是一个关于Memcache的示例项目,其中可能包含如何在Java环境中,特别是在使用XMemcached这个客户端库时,集成和使用Memcache的代码实例。XMemcached是一个高效、稳定的...
Memcache 是一个高性能的分布式内存对象缓存系统,它能够通过在内存中存储数据来减少对数据库的访问,从而提高Web应用的性能。... ...在Linux或Mac等其他操作系统上,可能需要编译安装。 安装步骤通常如下: ...
OS X 系统PHP 5.5.9 的 Memcache 客户端模块
Memcache是一个高性能的分布式内存对象缓存系统,用于减少数据库的访问次数,降低网络延迟,提高数据处理速度。它广泛应用于Web应用中,尤其是那些访问量大的系统,用以缓存各种数据,比如查询结果、对象、文件等。...
**分布式缓存技术——深入解析Memcached** Memcached是一款高性能的、分布式的内存对象缓存系统,它广泛应用于减轻数据库负载,提升Web应用性能。在本文中,我们将深入探讨Memcached的基本概念、工作原理,以及如何...
### Memcached数据库缓存策略详解 #### 一、引言 随着互联网技术的快速发展与用户需求的日益增长,高并发场景下的系统设计成为了许多大型网站和应用必须面对的问题之一。数据库作为信息系统的核心组件,其性能直接...
在IT领域,Memcached是一种广泛使用的分布式内存对象缓存系统,用于临时存储数据,以提高应用程序的性能。由于Memcached没有内置的客户端工具,开发者经常通过telnet来操作和测试Memcache服务。...
memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著[1] 。...
memcache使用