- 浏览: 326692 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
ljl961890233bear:
...
利用MySQL Cluster 7.0 + LVS 搭建高可用环境 -
wang1352083:
$m->listDBs(); 返回的是一个有dbnam ...
MongoDB PHP API 及用法 -
走忽闪953:
...
putty PasswordAuthentication -
jxhgzs001:
很好 很强大,不顶你一下 觉得过意不去啊
cocos2d 的一些实用代码 -
lingtianlan:
我实际测试的结果却和你不一样,调用顺序是awakeFromNi ...
[转]loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法
memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。起初作者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统, 这种方法不仅解决了共享内存只能是单机的弊端, 同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度!基于memcached作者对分布式cache的理解和解决方案。memcached完全可以用到其他地方 比如分布式数据库, 分布式计算等领域。
1、 memcached 协议理解
memcache是为了加快http://www.livejournal.com/访问速度而诞生的一个项目。
它的官方主页是:http://www.danga.com/memcached/
目前在网站开发中应用较少,主要的应用有:
http://www.danga.com/memcached/users.bml
在国内的网站开发中,还很少没见到有应用的,中文资料十分匮乏。
工作机制:通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度,和数据库是独立的。但是目前主要用来缓存数据库的数据。允许多个server通过网络形成一个大的hash,用户不必关心数据存放在哪,只调用相关接口就可。存放在内存的数据通过LRU算法进行淘汰出内存。同时可以通过删除和设置失效时间来淘汰存放在内存的数据。
2、 memcached 使用入门
2.1 memcached的安装
?<1>memcached服务的安装
先检查linux内核版本,建议将memcached 安装在2.6以上。
因为memcached 需要用到libevent和 epoll 。
memcached安装前首先确定你的服务器上面安装了libevent库,
libevent下载地址( http://www.monkey.org/~provos/libevent/)。
下载memcached的源码( http://www.danga.com/memcached/download.bml)。
Memcached最初是用perl写的,现在的版本是用c写的。
下载后拷贝到一个目录,安装需要root用户来执行
tar -zxvf memcached-1.1.12.tar.gz
cd memcached-1.1.12
./configure
这里必须先要configure, 它会检测你的系统情况,然后生成一个config.h文件和其它的几个文件,另外和其它的configure一样,你可以配置它的安装路径等等。默认应用程序安装在/usr/local/bin目录下。
make //编译
make install //安装
<2>memcached客户端的安装
根据memcached协议,用户可以自己写出符合自己要求的客户端程序。目前http://www.danga.com/memcached/download.bml
提供perl,c,java,python,php等客户端程序供下载和参考。下面我就以perl客户端程序为例说明客户端的安装:
下载后拷贝到一个目录,安装需要root用户来执行
2.2 快速入门
<1> memcached服务的启动
memcached的启动非常简单,它没有配置文件,只要配置好几个参数就可以使用了。下面我以一个实际应用的例子,具体说明一下:
memcached ?d ?m 500 -l 64.128.191.151 -p 11211 -vv >>/var/www/kelly/test/logs/memcached_$$.log
启动的这个memcached为一个后台守护进程模式(-d), 然后缓存的空间为500M(-m), 监听(-l)服务器64.128.191.15的11211号端口(-p).,将日志写道/var/www/kelly/test/logs/memcached_$$.log(-vv)。
其实memcached的参数也非常的有限,就下面这几个:
我们也可以将这个启动脚本写道/etc/rc.d或者/erc/rc.local,这样可以在服务器启动时候执行。
<2> memcached客户端的连接
下面我就以perl客户端程序为例说明客户端的连接:
启动两个memcached server
perl客户端程序
$ perl test-memcache.pl
$ perl test-memcache.pl
Value is '123'
可以看到,第一次没有取得my_key,第二次从memcached中得到my_key的值。
同时通过查看日志,可以发现的确存储在两个memcache server中。
这个简单的例子,解释了如何在memcached中存取数据,以及memcache是真正的分布式缓存系统。
当然,这还只是很简单的例子,体现不出memcache的优势,下面将通过一个很具体的例子,给出详细的应用。
3、 memcached在Zorpia的应用
http://www.zorpia.com 是一个网页相册,博客,交友,论坛的大型网站公司。现在已有超过140万活跃使用者遍布美国,香港,东南亚,欧洲,澳洲,亚洲等其它地区。每天的访问量都在增长,已成为全世界排名第五的社会生活关系网。
Memcached也采用了memcached来提高网站的访问速度,并且取得了很好的效果,我在负责zorpia的memcached项目时候积累了一些经验,主要的做法如下:
1) 通过对memcache的perl客户端进行包装,定制自己的客户端。
2) 通过制定符合zorpia规范的hash key命名规范
? ? memcache中需要存储的内容的key均由string组成。
这个string统一由一个memcache.pm的subroutine来实现。(假设这个subroutine是 get_key() )
? ? memcache中存放两种形式的数据
(1) result of SQL query :
(2) 普通变量(variable)
这两种数据的key的组合方式是不相同的,由get_key进行判断和完成
? ? 关于get_key 和 naming rule
get_key subroutine完成所有memcache key的命名,naming rule也是在它里边体现:
(1)输入参数 -- hash结构,里边定义了当前需要存放的数据的信息
结构
(2)返回值 -- string,返回数据的key_name
?必须确定 get_key 的传入hash的结构,
hash中主要有两个元素
type --- 定义当前数据结构的类型 ,有 'var' , 'sql'两种值
object --- 存放当前数据结构的详细信息,
当 type eq 'var'时,object表示变量的名字,该名字由程序员指定
当 type eq 'sql'时,object包含所存放sql的主要基本信息,hash结构,也由程序员按照规则制定
## 当variable 数据类型,比较简单
$var_hash = {
type => 'var', ## var表示当前类型是 variable
object => 'language', ## language代表variable的名字
};
生成的key是Zorpia::var| language
## sql 数据
比如select first_name from user where user_id =2那么hash为
$sql_hash = {
type => 'sql',
object => {
table => {table2=>"user",}, ## sql 查询的表
column => {column1=>"first_name",}, ## sql所要查询的column
condition => { user_id =>"2",}, ## sql条件
},
};
生成的key是Zorpia::sql|user|first_name| user_id =2
get_key subroutine必须对传入hash进行判断,对不同类型的数据按照不同的方式组合,形成key,返回给使用者。这个key,必须保证其唯一性:
比如:所有字母小写,一些数组在组合成key之前必须首先排序
? ? get_key函数
?经常访问的表user,user_details
?合理设定变量在memcached的生存周期
?将活跃用户的信息预先导入到memcached
?分别在多台机器上启动多个memcached服务
?编写脚本监控memcached服务是否活动
4) User表的具体应用举例
? 在 select时候
先查询memcahce里有没有,有的话,返回;否则从数据库select,在memcache里设置,返回。
先在数据库update,insert,delete,在memcache里设置,返回。
使用了memcached以后, 我发现以前做过的很多的项目都可以应用它提高效率,包括最近做的“大单追踪”, “数码搜索”等等。当然既然memcahced是分布式的缓存系统,那么它就是建立了一个分布式的平台, 我们可以用它来进行分布式的记数, 因为对于一个键值key我们可以设置它的数值以及有效期在参数中,另外还可以重新设置这个键值的数值。 所以我总结了一下目前可以应用到的地方:
<1>.数据库检索结果的缓存,也就是说可以有机的和数据库结合起来应用,提高效率。
这也是目前memcached用到的最多的地方,比如用于大型网站等。
可以这样来实现:
打开memcached服务器连接
编写sql语句, 同时算出它的一个hash key值
获取这个hash值的memcached保存数据(get)
如果获取的这个hash值的数据存在。返回
否则连接数据库查找
把这个查找结果保存在memcached中(set),可以设置有效期
返回查找结果
<2>.分布式计算
<3>.分布式共享数据
总之,memcached的机制比较灵活,可以适用于一切需要分布式缓存数据的地方,随着memcached逐渐为人所知,必将在更多的分布式应用领域大放异彩。
http://nio.infor96.com/php-memcached/
一、memcached 简介
在很多场合,我们都会听到 memcached 这个名字,但很多同学只是听过,并没有用过或实际了解过,只知道它是一个很不错的东东。这里简单介绍一下,memcached 是高效、快速的分布式内存对象缓存系统,主要用于加速 WEB 动态应用程序。
二、memcached 安装
首先是下载 memcached 了,目前最新版本是 1.1.12,直接从官方网站即可下载到 memcached-1.1.12.tar.gz。除此之外,memcached 用到了 libevent,我下载的是 libevent-1.1a.tar.gz。
接下来是分别将 libevent-1.1a.tar.gz 和 memcached-1.1.12.tar.gz 解开包、编译、安装:
三、运行 memcached 守护程序
运行 memcached 守护程序很简单,只需一个命令行即可,不需要修改任何配置文件(也没有配置文件给你修改 ):
-d 以守护程序(daemon)方式运行 memcached;-m 设置 memcached 可以使用的内存大小,单位为 M;-l 设置监听的 IP 地址,如果是本机的话,通常可以不设置此参数;-p 设置监听的端口,默认为 11211,所以也可以不设置此参数;-u 指定用户,如果当前为 root 的话,需要使用此参数指定用户。当然,还有其它参数可以用,man memcached 一下就可以看到了。
四、memcached 的工作原理
首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。
三、PHP 如何作为 memcached 客户端
有两种方法可以使 PHP 作为 memcached 客户端,调用 memcached 的服务进行对象存取操作。
第一种,PHP 有一个叫做 memcache 的扩展,Linux 下编译时需要带上 ?enable-memcache[=DIR] 选项,Window 下则在 php.ini 中去掉 php_memcache.dll 前边的注释符,使其可用。
除此之外,还有一种方法,可以避开扩展、重新编译所带来的麻烦,那就是直接使用 php-memcached-client。
本文选用第二种方式,虽然效率会比扩展库稍差一些,但问题不大。
四、PHP memcached 应用示例
首先 下载 memcached-client.php,在下载了 memcached-client.php 之后,就可以通过这个文件中的类“memcached”对 memcached 服务进行操作了。其实代码调用非常简单,主要会用到的方法有 add()、get()、replace() 和 delete(),方法说明如下:
add ($key, $val, $exp = 0)
往 memcached 中写入对象,$key 是对象的唯一标识符,$val 是写入的对象数据,$exp 为过期时间,单位为秒,默认为不限时间;
get ($key)
从 memcached 中获取对象数据,通过对象的唯一标识符 $key 获取;
replace ($key, $value, $exp=0)
使用 $value 替换 memcached 中标识符为 $key 的对象内容,参数与 add() 方法一样,只有 $key 对象存在的情况下才会起作用;
delete ($key, $time = 0)
删除 memcached 中标识符为 $key 的对象,$time 为可选参数,表示删除之前需要等待多长时间。
下面是一段简单的测试代码,代码中对标识符为 ‘mykey’ 的对象数据进行存取操作:
// 包含 memcached 类文件require_once(‘memcached-client.php’);// 选项设置$options = array( ’servers’ => array(‘192.168.1.1:11211′), //memcached 服务的地址、端口,可用多个数组元素表示多个 memcached 服务 ‘debug’ => true, //是否打开 debug ‘compress_threshold’ => 10240, //超过多少字节的数据时进行压缩 ‘persistant’ => false //是否使用持久连接 );// 创建 memcached 对象实例$mc = new memcached($options);// 设置此脚本使用的唯一标识符$key = ‘mykey’;// 往 memcached 中写入对象$mc->add($key, ’some random strings’);$val = $mc->get($key);echo “n”.str_pad(‘$mc->add() ’, 60, ‘_’).“n”;var_dump($val);// 替换已写入的对象数据值$mc->replace($key, array(’some’=>‘haha’, ‘array’=>‘xxx’));$val = $mc->get($key);echo “n”.str_pad(‘$mc->replace() ’, 60, ‘_’).“n”;var_dump($val);// 删除 memcached 中的对象$mc->delete($key);$val = $mc->get($key);echo “n”.str_pad(‘$mc->delete() ’, 60, ‘_’).“n”;var_dump($val);?>
是不是很简单,在实际应用中,通常会把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担。通常会将 SQL 语句 md5() 之后的值作为唯一标识符 key。下边是一个利用 memcached 来缓存数据库查询结果集的示例(此代码片段紧接上边的示例代码):
= ‘SELECT * FROM users’;$key = md5($sql); //memcached 对象标识符if ( !($datas = $mc->get($key)) ) { // 在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。 echo “n”.str_pad(‘Read datas from MySQL.’, 60, ‘_’).“n”; $conn = mysql_connect(‘localhost’, ‘test’, ‘test’); mysql_select_db(‘test’); $result = mysql_query($sql); while ($row = mysql_fetch_object($result)) $datas[] = $row; // 将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。 $mc->add($key, $datas);} else { echo “n”.str_pad(‘Read datas from memcached.’, 60, ‘_’).“n”;}var_dump($datas);?>可以看出,使用 memcached 之后,可以减少数据库连接、查询操作,数据库负载下来了,脚本的运行速度也提高了。
之前我曾经写过一篇名为《PHP 实现多服务器共享 SESSION 数据》文章,文中的 SESSION 是使用数据库保存的,在并发访问量大的时候,服务器的负载会很大,经常会超出 MySQL 最大连接数,利用 memcached,我们可以很好地解决这个问题,工作原理如下:
用户访问网页时,查看 memcached 中是否有当前用户的 SESSION 数据,使用 session_id() 作为唯一标识符;如果数据存在,则直接返回,如果不存在,再进行数据库连接,获取 SESSION 数据,并将此数据保存到 memcached 中,供下次使用;
当前的 PHP 运行结束(或使用了 session_write_close())时,会调用 My_Sess::write() 方法,将数据写入数据库,这样的话,每次仍然会有数据库操作,对于这个方法,也需要进行优化。使用一个全局变量,记录用户进入页面时的 SESSION 数据,然后在 write() 方法内比较此数据与想要写入的 SESSION 数据是否相同,不同才进行数据库连接、写入数据库,同时将 memcached 中对应的对象删除,如果相同的话,则表示 SESSION 数据未改变,那么就可以不做任何操作,直接返回了;
那么用户 SESSION 过期时间怎么解决呢?记得 memcached 的 add() 方法有个过期时间参数 $exp 吗?把这个参数值设置成小于 SESSION 最大存活时间即可。另外别忘了给那些一直在线的用户延续 SESSION 时长,这个可以在 write() 方法中解决,通过判断时间,符合条件则更新数据库数据。
五、相关资源
memcached 官方网站
PHP memcached client
下载 memcached-client.php
http://www.dirk.sh/diary/216
Memcached 是一个非常优秀的缓存加速系统,和 Squid 的前端缓存加速不同,它是通过基于内存缓存对象来减少数据库查询的方式改善网站系统的反应,而其中最吸引人的一个特性就是支持分布式部署;也就是说可以在一群机器上建立一堆 Memcached 服务,每个服务可以根据具体服务器的硬件配置使用不同大小的内存块,这样一来,理论上可以建立一个无限巨大的基于内存的 cache storage 系统。
Php 下的 Memcached 官方 API 是 memcache 这个包,前不久发布 2.0.0 stable 版本,关键的更新是增加了 addServer() 函数用于支持 Multiple servers with loadbalancing and failover,在 FreeBSD 下安装:
[root@trinity ~]# cd /usr/ports/databases/memcached/[root@trinity ~]# make install clean[root@trinity ~]# cd /usr/ports/databases/pecl-memcache[root@trinity ~]# make install clean另外一个号称更快的 API 包是 mcache,看作者的说明,是直接使用了 libmemcache,但在 FreeBSD 下目前还没有 Ports,需要源代码方式安装,具体可以参考 mcache 的说明。
一个简单的 PHP 脚本示例:
addServer('localhost', 11211);$memcache->addServer('localhost', 11212);if ($memcache) { $count = intval($memcache->get('static_count')); $count ++; $memcache->set('static_count', $count, 0, 30); var_dump($memcache->get('static_count'));} else { echo "Connection to memcached failed";}?>但不管 Memcached 是一个多么优秀的东西,在没有合理的缓存策略(缓存什么东西?如何缓存?缓存时机?过期策略?)的情况下,只会被滥用,发挥不了真正的作用。构思中…...
1、 memcached 协议理解
memcache是为了加快http://www.livejournal.com/访问速度而诞生的一个项目。
它的官方主页是:http://www.danga.com/memcached/
目前在网站开发中应用较少,主要的应用有:
http://www.danga.com/memcached/users.bml
在国内的网站开发中,还很少没见到有应用的,中文资料十分匮乏。
工作机制:通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度,和数据库是独立的。但是目前主要用来缓存数据库的数据。允许多个server通过网络形成一个大的hash,用户不必关心数据存放在哪,只调用相关接口就可。存放在内存的数据通过LRU算法进行淘汰出内存。同时可以通过删除和设置失效时间来淘汰存放在内存的数据。
2、 memcached 使用入门
2.1 memcached的安装
?<1>memcached服务的安装
先检查linux内核版本,建议将memcached 安装在2.6以上。
因为memcached 需要用到libevent和 epoll 。
memcached安装前首先确定你的服务器上面安装了libevent库,
libevent下载地址( http://www.monkey.org/~provos/libevent/)。
下载memcached的源码( http://www.danga.com/memcached/download.bml)。
Memcached最初是用perl写的,现在的版本是用c写的。
下载后拷贝到一个目录,安装需要root用户来执行
tar -zxvf memcached-1.1.12.tar.gz
cd memcached-1.1.12
./configure
这里必须先要configure, 它会检测你的系统情况,然后生成一个config.h文件和其它的几个文件,另外和其它的configure一样,你可以配置它的安装路径等等。默认应用程序安装在/usr/local/bin目录下。
make //编译
make install //安装
<2>memcached客户端的安装
根据memcached协议,用户可以自己写出符合自己要求的客户端程序。目前http://www.danga.com/memcached/download.bml
提供perl,c,java,python,php等客户端程序供下载和参考。下面我就以perl客户端程序为例说明客户端的安装:
下载后拷贝到一个目录,安装需要root用户来执行
tar -zxvf Cache-Memcached-1.14.tar.gz cd Cache-Memcached-1.14 perl makefile.pl make make install make test这样就安装好了memcahced, 启动memcached就可使用分布式缓存系统了!
2.2 快速入门
<1> memcached服务的启动
memcached的启动非常简单,它没有配置文件,只要配置好几个参数就可以使用了。下面我以一个实际应用的例子,具体说明一下:
memcached ?d ?m 500 -l 64.128.191.151 -p 11211 -vv >>/var/www/kelly/test/logs/memcached_$$.log
启动的这个memcached为一个后台守护进程模式(-d), 然后缓存的空间为500M(-m), 监听(-l)服务器64.128.191.15的11211号端口(-p).,将日志写道/var/www/kelly/test/logs/memcached_$$.log(-vv)。
其实memcached的参数也非常的有限,就下面这几个:
? -p port number to listen on ? -l interface to listen on, default is INDRR_ANY ? -d run as a daemon ? -r maximize core file limit ? -u assume identity of (only when run as root) ? -m max memory to use for items in megabytes, default is 64 MB ? -M return error on memory exhausted (rather than removing items) ? -c max simultaneous connections, default is 1024 ? -k lock down all paged memory ? -v verbose (print errors/warnings while in event loop) ? -vv very verbose (also print client commands/reponses) ? -h print this help and exit ? -i print memcached and libevent license
我们也可以将这个启动脚本写道/etc/rc.d或者/erc/rc.local,这样可以在服务器启动时候执行。
<2> memcached客户端的连接
下面我就以perl客户端程序为例说明客户端的连接:
启动两个memcached server
memcached ?d ?m 500 -l 64.128.191.151 -p 11211 -vv >>/var/www/kelly/test/logs/memcached_$$.log memcached ?d ?m 500 -l 64.128.191.151 -p 11212 -vv >>/var/www/kelly/test/logs/memcached_$$.log
perl客户端程序
#!/usr/bin/perl use Cache::Memcached; my $memd = new Cache::Memcached { 'servers' => [ "64.128.191.15:11211" , "64.128.191.15:11212"], }; my $val = $memd->get( "my_key" ); if ( $val ) { print "Value is '$val'\n"; } # Set a value $memd->set("my_key", "123"); $memd->disconnect_all();?运行测试
$ perl test-memcache.pl
$ perl test-memcache.pl
Value is '123'
可以看到,第一次没有取得my_key,第二次从memcached中得到my_key的值。
同时通过查看日志,可以发现的确存储在两个memcache server中。
这个简单的例子,解释了如何在memcached中存取数据,以及memcache是真正的分布式缓存系统。
当然,这还只是很简单的例子,体现不出memcache的优势,下面将通过一个很具体的例子,给出详细的应用。
3、 memcached在Zorpia的应用
http://www.zorpia.com 是一个网页相册,博客,交友,论坛的大型网站公司。现在已有超过140万活跃使用者遍布美国,香港,东南亚,欧洲,澳洲,亚洲等其它地区。每天的访问量都在增长,已成为全世界排名第五的社会生活关系网。
Memcached也采用了memcached来提高网站的访问速度,并且取得了很好的效果,我在负责zorpia的memcached项目时候积累了一些经验,主要的做法如下:
1) 通过对memcache的perl客户端进行包装,定制自己的客户端。
2) 通过制定符合zorpia规范的hash key命名规范
? ? memcache中需要存储的内容的key均由string组成。
这个string统一由一个memcache.pm的subroutine来实现。(假设这个subroutine是 get_key() )
? ? memcache中存放两种形式的数据
(1) result of SQL query :
(2) 普通变量(variable)
这两种数据的key的组合方式是不相同的,由get_key进行判断和完成
? ? 关于get_key 和 naming rule
get_key subroutine完成所有memcache key的命名,naming rule也是在它里边体现:
(1)输入参数 -- hash结构,里边定义了当前需要存放的数据的信息
结构
(2)返回值 -- string,返回数据的key_name
?必须确定 get_key 的传入hash的结构,
hash中主要有两个元素
type --- 定义当前数据结构的类型 ,有 'var' , 'sql'两种值
object --- 存放当前数据结构的详细信息,
当 type eq 'var'时,object表示变量的名字,该名字由程序员指定
当 type eq 'sql'时,object包含所存放sql的主要基本信息,hash结构,也由程序员按照规则制定
## 当variable 数据类型,比较简单
$var_hash = {
type => 'var', ## var表示当前类型是 variable
object => 'language', ## language代表variable的名字
};
生成的key是Zorpia::var| language
## sql 数据
比如select first_name from user where user_id =2那么hash为
$sql_hash = {
type => 'sql',
object => {
table => {table2=>"user",}, ## sql 查询的表
column => {column1=>"first_name",}, ## sql所要查询的column
condition => { user_id =>"2",}, ## sql条件
},
};
生成的key是Zorpia::sql|user|first_name| user_id =2
get_key subroutine必须对传入hash进行判断,对不同类型的数据按照不同的方式组合,形成key,返回给使用者。这个key,必须保证其唯一性:
比如:所有字母小写,一些数组在组合成key之前必须首先排序
? ? get_key函数
sub get_key{ my $hash = shift; return undef unless $hash && ref $hash eq "HASH"; my $type = $hash->{type}; my $key_name; if ($type eq 'sql') { my ($table_key,$column_key,$condition_key); $table_key=_get_key($hash->{object}->{table}); $column_key=_get_key($hash->{object}->{column}); $condition_key=_get_key($hash->{object}->{condition}); $key_name = join('|',$type,$table_key,$column_key,$condition_key); #Currently the length limit of a key is set at 250 characters if (length($key_name)>250) { $key_name=substr(0,250,$key_name); } } elsif($type eq 'var') { $key_name = join('|',$type,$hash->{object}); } return $key_name; } sub _get_key { my $hash=shift; return undef unless $hash && ref $hash eq "HASH"; my ($t,$ret,$i); foreach $i (sort keys %$hash) { $i=~s/^\s+|\s+$//g; $hash->{$i}=~s/^\s+|\s+$//g; push(@$t,lc("$i=$hash->{$i}")); } $ret=join(':',sort { $a cmp $b } @$t); return $ret; }3) 制定需要应用memcached的规则
?经常访问的表user,user_details
?合理设定变量在memcached的生存周期
?将活跃用户的信息预先导入到memcached
?分别在多台机器上启动多个memcached服务
?编写脚本监控memcached服务是否活动
4) User表的具体应用举例
? 在 select时候
先查询memcahce里有没有,有的话,返回;否则从数据库select,在memcache里设置,返回。
my $sql_hash = { type => 'sql', object => { table => {table1=>"user",}, column => {column1=>"user_id",}, condition => {email=>$user_id,}, }, }; my $key=Zorpia::MemCache::get_key($sql_hash); my $user_id_by_email=Zorpia::MemCache::get($key); if(!$user_id_by_email) { my $sth; my $query ="select user_id from user where email=?"; $sth = $dbh->prepare($query); $sth->execute($user_id); my $user1 = $sth->fetchrow_hashref(); $user_id_by_email=$user1->{'user_id'}; Zorpia::MemCache::set($key,$user_id_by_email,1800); }?在 update,insert,delete时候
先在数据库update,insert,delete,在memcache里设置,返回。
&Zorpia::DB::data_entry_no_return($dbh,"user","COUNT(*)","$account_information_insert_statement user_id=$current_user_id", "user_id=$current_user_id"); #add by kelly my $sql_hash = { type => 'sql', object => { table => {table1=>"user",}, column => {column1=>"user_id",}, condition => {user_id=>$current_user_id,}, }, }; my $key=Zorpia::MemCache::get_key($sql_hash); my $query = "SELECT *, user_id AS id FROM user WHERE user_id=?"; my $sth_memc = $dbh->prepare($query); $sth_memc->execute($current_user_id); my $user_memc = $sth_memc->fetchrow_hashref(); &Zorpia::MemCache::set($key,$user_memc,21600);4、 memcached的应用展望
使用了memcached以后, 我发现以前做过的很多的项目都可以应用它提高效率,包括最近做的“大单追踪”, “数码搜索”等等。当然既然memcahced是分布式的缓存系统,那么它就是建立了一个分布式的平台, 我们可以用它来进行分布式的记数, 因为对于一个键值key我们可以设置它的数值以及有效期在参数中,另外还可以重新设置这个键值的数值。 所以我总结了一下目前可以应用到的地方:
<1>.数据库检索结果的缓存,也就是说可以有机的和数据库结合起来应用,提高效率。
这也是目前memcached用到的最多的地方,比如用于大型网站等。
可以这样来实现:
打开memcached服务器连接
编写sql语句, 同时算出它的一个hash key值
获取这个hash值的memcached保存数据(get)
如果获取的这个hash值的数据存在。返回
否则连接数据库查找
把这个查找结果保存在memcached中(set),可以设置有效期
返回查找结果
<2>.分布式计算
<3>.分布式共享数据
总之,memcached的机制比较灵活,可以适用于一切需要分布式缓存数据的地方,随着memcached逐渐为人所知,必将在更多的分布式应用领域大放异彩。
http://nio.infor96.com/php-memcached/
一、memcached 简介
在很多场合,我们都会听到 memcached 这个名字,但很多同学只是听过,并没有用过或实际了解过,只知道它是一个很不错的东东。这里简单介绍一下,memcached 是高效、快速的分布式内存对象缓存系统,主要用于加速 WEB 动态应用程序。
二、memcached 安装
首先是下载 memcached 了,目前最新版本是 1.1.12,直接从官方网站即可下载到 memcached-1.1.12.tar.gz。除此之外,memcached 用到了 libevent,我下载的是 libevent-1.1a.tar.gz。
接下来是分别将 libevent-1.1a.tar.gz 和 memcached-1.1.12.tar.gz 解开包、编译、安装:
# tar -xzf libevent-1.1a.tar.gz# cd libevent-1.1a# ./configure --prefix=/usr# make# make install# cd ..# tar -xzf memcached-1.1.12.tar.gz# cd memcached-1.1.12# ./configure --prefix=/usr# make#make install安装完成之后,memcached 应该在 /usr/bin/memcached。
三、运行 memcached 守护程序
运行 memcached 守护程序很简单,只需一个命令行即可,不需要修改任何配置文件(也没有配置文件给你修改 ):
/usr/bin/memcached -d -m 128 -l 192.168.1.1 -p 11211 -u httpd参数解释:
-d 以守护程序(daemon)方式运行 memcached;-m 设置 memcached 可以使用的内存大小,单位为 M;-l 设置监听的 IP 地址,如果是本机的话,通常可以不设置此参数;-p 设置监听的端口,默认为 11211,所以也可以不设置此参数;-u 指定用户,如果当前为 root 的话,需要使用此参数指定用户。当然,还有其它参数可以用,man memcached 一下就可以看到了。
四、memcached 的工作原理
首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。
三、PHP 如何作为 memcached 客户端
有两种方法可以使 PHP 作为 memcached 客户端,调用 memcached 的服务进行对象存取操作。
第一种,PHP 有一个叫做 memcache 的扩展,Linux 下编译时需要带上 ?enable-memcache[=DIR] 选项,Window 下则在 php.ini 中去掉 php_memcache.dll 前边的注释符,使其可用。
除此之外,还有一种方法,可以避开扩展、重新编译所带来的麻烦,那就是直接使用 php-memcached-client。
本文选用第二种方式,虽然效率会比扩展库稍差一些,但问题不大。
四、PHP memcached 应用示例
首先 下载 memcached-client.php,在下载了 memcached-client.php 之后,就可以通过这个文件中的类“memcached”对 memcached 服务进行操作了。其实代码调用非常简单,主要会用到的方法有 add()、get()、replace() 和 delete(),方法说明如下:
add ($key, $val, $exp = 0)
往 memcached 中写入对象,$key 是对象的唯一标识符,$val 是写入的对象数据,$exp 为过期时间,单位为秒,默认为不限时间;
get ($key)
从 memcached 中获取对象数据,通过对象的唯一标识符 $key 获取;
replace ($key, $value, $exp=0)
使用 $value 替换 memcached 中标识符为 $key 的对象内容,参数与 add() 方法一样,只有 $key 对象存在的情况下才会起作用;
delete ($key, $time = 0)
删除 memcached 中标识符为 $key 的对象,$time 为可选参数,表示删除之前需要等待多长时间。
下面是一段简单的测试代码,代码中对标识符为 ‘mykey’ 的对象数据进行存取操作:
// 包含 memcached 类文件require_once(‘memcached-client.php’);// 选项设置$options = array( ’servers’ => array(‘192.168.1.1:11211′), //memcached 服务的地址、端口,可用多个数组元素表示多个 memcached 服务 ‘debug’ => true, //是否打开 debug ‘compress_threshold’ => 10240, //超过多少字节的数据时进行压缩 ‘persistant’ => false //是否使用持久连接 );// 创建 memcached 对象实例$mc = new memcached($options);// 设置此脚本使用的唯一标识符$key = ‘mykey’;// 往 memcached 中写入对象$mc->add($key, ’some random strings’);$val = $mc->get($key);echo “n”.str_pad(‘$mc->add() ’, 60, ‘_’).“n”;var_dump($val);// 替换已写入的对象数据值$mc->replace($key, array(’some’=>‘haha’, ‘array’=>‘xxx’));$val = $mc->get($key);echo “n”.str_pad(‘$mc->replace() ’, 60, ‘_’).“n”;var_dump($val);// 删除 memcached 中的对象$mc->delete($key);$val = $mc->get($key);echo “n”.str_pad(‘$mc->delete() ’, 60, ‘_’).“n”;var_dump($val);?>
是不是很简单,在实际应用中,通常会把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担。通常会将 SQL 语句 md5() 之后的值作为唯一标识符 key。下边是一个利用 memcached 来缓存数据库查询结果集的示例(此代码片段紧接上边的示例代码):
= ‘SELECT * FROM users’;$key = md5($sql); //memcached 对象标识符if ( !($datas = $mc->get($key)) ) { // 在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。 echo “n”.str_pad(‘Read datas from MySQL.’, 60, ‘_’).“n”; $conn = mysql_connect(‘localhost’, ‘test’, ‘test’); mysql_select_db(‘test’); $result = mysql_query($sql); while ($row = mysql_fetch_object($result)) $datas[] = $row; // 将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。 $mc->add($key, $datas);} else { echo “n”.str_pad(‘Read datas from memcached.’, 60, ‘_’).“n”;}var_dump($datas);?>可以看出,使用 memcached 之后,可以减少数据库连接、查询操作,数据库负载下来了,脚本的运行速度也提高了。
之前我曾经写过一篇名为《PHP 实现多服务器共享 SESSION 数据》文章,文中的 SESSION 是使用数据库保存的,在并发访问量大的时候,服务器的负载会很大,经常会超出 MySQL 最大连接数,利用 memcached,我们可以很好地解决这个问题,工作原理如下:
用户访问网页时,查看 memcached 中是否有当前用户的 SESSION 数据,使用 session_id() 作为唯一标识符;如果数据存在,则直接返回,如果不存在,再进行数据库连接,获取 SESSION 数据,并将此数据保存到 memcached 中,供下次使用;
当前的 PHP 运行结束(或使用了 session_write_close())时,会调用 My_Sess::write() 方法,将数据写入数据库,这样的话,每次仍然会有数据库操作,对于这个方法,也需要进行优化。使用一个全局变量,记录用户进入页面时的 SESSION 数据,然后在 write() 方法内比较此数据与想要写入的 SESSION 数据是否相同,不同才进行数据库连接、写入数据库,同时将 memcached 中对应的对象删除,如果相同的话,则表示 SESSION 数据未改变,那么就可以不做任何操作,直接返回了;
那么用户 SESSION 过期时间怎么解决呢?记得 memcached 的 add() 方法有个过期时间参数 $exp 吗?把这个参数值设置成小于 SESSION 最大存活时间即可。另外别忘了给那些一直在线的用户延续 SESSION 时长,这个可以在 write() 方法中解决,通过判断时间,符合条件则更新数据库数据。
五、相关资源
memcached 官方网站
PHP memcached client
下载 memcached-client.php
http://www.dirk.sh/diary/216
Memcached 是一个非常优秀的缓存加速系统,和 Squid 的前端缓存加速不同,它是通过基于内存缓存对象来减少数据库查询的方式改善网站系统的反应,而其中最吸引人的一个特性就是支持分布式部署;也就是说可以在一群机器上建立一堆 Memcached 服务,每个服务可以根据具体服务器的硬件配置使用不同大小的内存块,这样一来,理论上可以建立一个无限巨大的基于内存的 cache storage 系统。
Php 下的 Memcached 官方 API 是 memcache 这个包,前不久发布 2.0.0 stable 版本,关键的更新是增加了 addServer() 函数用于支持 Multiple servers with loadbalancing and failover,在 FreeBSD 下安装:
[root@trinity ~]# cd /usr/ports/databases/memcached/[root@trinity ~]# make install clean[root@trinity ~]# cd /usr/ports/databases/pecl-memcache[root@trinity ~]# make install clean另外一个号称更快的 API 包是 mcache,看作者的说明,是直接使用了 libmemcache,但在 FreeBSD 下目前还没有 Ports,需要源代码方式安装,具体可以参考 mcache 的说明。
一个简单的 PHP 脚本示例:
addServer('localhost', 11211);$memcache->addServer('localhost', 11212);if ($memcache) { $count = intval($memcache->get('static_count')); $count ++; $memcache->set('static_count', $count, 0, 30); var_dump($memcache->get('static_count'));} else { echo "Connection to memcached failed";}?>但不管 Memcached 是一个多么优秀的东西,在没有合理的缓存策略(缓存什么东西?如何缓存?缓存时机?过期策略?)的情况下,只会被滥用,发挥不了真正的作用。构思中…...
发表评论
-
she
2013-03-27 22:43 0把申购和收货纳入资产 ... -
PHP中插件机制的一种实现方案
2010-11-26 18:42 1503一篇不错的关于php插件 ... -
九个PHP很有用的函数
2010-08-09 12:10 1364下面是九个PHP中很有用的功能,不知道你用过了吗? 1. 函 ... -
百万级PHP网站架构工具箱
2010-08-09 11:08 1691在了解过世界最大的PHP站点,Facebook的后台技术后,今 ... -
图片服务器和WEB应用服务器相分离的简单方案
2010-08-06 12:45 8721只是简单说明一下原理,其它的自己探索吧:) 一、两个域名:w ... -
MongoDB PHP API 及用法
2010-04-06 13:00 9621上篇说过如何安装php - Mongo扩展,现在说一下Mong ... -
从魔兽看PHP设计模式
2009-11-03 16:35 989前段时间看到有人用魔 ... -
PHP开发部分关键词
2009-10-19 10:07 1110从别人那里看到,能学习到一半的话,已经是很不错了,加油 th ... -
PHP实现多服务器session共享之memcache共享
2009-08-19 10:07 1541再自定义一套session处理机制,关于session的实现方 ... -
ICE-高效的中间件平台,牛刀小试
2009-08-17 10:48 1418ICE 看起来是个好东西! ... -
今天无事,就试试一个php datagrid
2009-08-15 09:42 2023先贴代码: <?php include ... -
php字符过滤
2009-08-05 09:35 1540MYSQL特殊字符:mysql_escape_string() ... -
PHP缓存加速器:eAccelerator
2009-07-30 14:24 2319eAccelerator README for Linux 简 ... -
讲讲php的魔术方法
2009-07-30 09:49 1364PHP5.0后,php面向对象提成更多方法,使得php更加的强 ... -
(一)PHP设计模式之工厂模式
2009-07-27 14:24 976工厂模式在规模较小的环境中似乎有些大材小用。不过,最好还是学习 ... -
PHP的5种常见的设计模式
2009-07-27 14:22 10001.工厂模式 2.单例模式 也叫单元素模式 3.观察者模式 4 ... -
基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计
2009-07-21 12:36 1848前言:本文阐述的是一款经过生产环境检验的千万级数据全文检索(搜 ... -
amf使用简介
2009-07-13 16:07 2640最近需要用到amf 与flex ... -
php 使用socket 与c通讯
2009-06-22 18:19 1316今天需要和c,进行通讯!!c程序员写了一个接口,我需要 ... -
PHP几个数组函数的区别
2009-06-17 10:10 1259刚才用到了数组合并的函数,去看了手册,现在记录下来他们的区别: ...
相关推荐
【Memcached 在大型网站中的应用】 Memcached 是一个高效、分布式的内存对象缓存系统,设计初衷是为了提升网站的访问速度,尤其是对于那些依赖数据库的动态网页应用。它通过建立一个内存中的大哈希表来存储各种类型...
《Memcached在大型网站中的应用归纳》 Memcached是一款高性能的分布式内存对象缓存系统,其设计初衷是为了提升动态网页应用的访问速度,尤其是减轻数据库的检索压力。它通过建立一个内存中的大哈希表,可以高效地...
Memcached 通过在内存中创建一个大型哈希表来存储各种类型的数据,如图片、视频、文件或数据库查询结果,以减少对数据库的直接访问,从而降低数据库负载,提高响应速度。 **工作原理与特点:** 1. **分布式存储**:...
在实际的网站应用中,Memcached被广泛应用于各种高流量网站和大型互联网应用中,例如社交网络、电子商务平台等。通过将常用数据缓存到Memcached中,可以显著减少数据库查询次数,提高网站的响应速度和用户体验。 ##...
在实际应用中,Memcached与PHP结合使用较多,因为PHP提供了对Memcached的完整扩展支持。 ### 实际应用与优势 Memcached通过其简易的协议和高效的数据管理,可以有效地降低数据库的访问延迟,提高Web应用的性能。...
在实际应用中,数据库查询结果通常会被保存到memcached中,这样用户再次访问时,可以从缓存而不是数据库中获取数据,减少数据库的读取压力。这种做法极大地提升了Web应用的运行效率,尤其是在高并发访问的场景下。 ...
在互联网技术的推动下,社交网站和社交游戏作为新兴的网络应用形式,正在迅速增长。社交游戏依托于大型社交网络服务(SNS),具有操作简单和强调玩家间互动的特点。社交游戏的服务器端承担了大量的逻辑处理工作,需...
Memcached的设计理念是简单、快速,它支持多种编程语言,并且在很多大型网站和应用中得到了广泛应用。 ### Memcached的基础概念 1. **键值对存储**:Memcached以键值对的形式存储数据,键(key)是唯一的标识符,...
大型应用可以配置多个Memcached实例,并根据业务逻辑进行数据分片,分散负载。 3. 选择合适的缓存策略: 根据数据访问模式,可以选择LRU(Least Recently Used)或LFU(Least Frequently Used)等淘汰策略。 六、...
【memcached 安装应用详解】 `memcached`是一个高效且分布式的内存对象缓存系统,主要用于缓解数据库的检索压力,提升网站访问...在实际应用中,可以结合不同的业务需求,通过调整参数和策略,实现更优的性能表现。
在大型分布式应用中,缓存技术是提高性能的关键,特别是对于数据库操作频繁的情况。通过使用二级缓存,可以减少对数据库的直接访问,从而降低系统的负载。 Memcached是一种高性能的、分布式的内存对象缓存系统,...
Memcached是一款分布式内存对象缓存系统,广泛应用于高性能网站和应用中。它设计的目标是简化并加速动态Web应用程序的数据存储,通过将数据存储在内存中,避免频繁读取或写入数据库,从而提高系统响应速度。 二、...
这是一个常见的解决大型Web应用中Session管理问题的策略,尤其是在集群部署的情况下。 Memcached是一款高性能、分布式内存对象缓存系统,它可以将数据存储在内存中,从而提供快速的数据访问。在Web应用中,Session...
在分布式系统中,Session共享是一个常见的挑战,尤其是在多个应用服务器如Tomcat之间。为了实现这一目标,我们可以结合Nginx反向代理服务器和memcached内存缓存系统来达到高效、可靠的Session共享。以下是对这个主题...
在.NET环境中利用Memcached进行高效的缓存管理是一个关键的技术策略,尤其对于大型的、数据库驱动的Web应用程序。Memcached是一个轻量级的分布式内存对象缓存系统,它能够显著提高性能,减少对数据库的访问压力。...
- **memcached的性能**:分享了mixi在实际应用中获得的memcached性能指标。 **兼容应用程序** - **TokyoTyrant案例**:介绍了TokyoTyrant作为memcached的一种替代方案,在mixi的应用情况。 #### 总结 memcached...
memcache服务器群,一款分布式缓存产品,很多大型网站在应用; 它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。因为...
1. **memcached概述**:memcached是由Danga Interactive公司开发的一款内存键值存储系统,最初用于LiveJournal,后来广泛应用在许多大型网站,如Facebook、Twitter等。它旨在简化动态Web应用程序的数据存储,通过...
Memcached基于键值对(key-value)存储机制,应用程序可以将数据以键值对的形式存储在Memcached中。当需要访问这些数据时,应用程序首先会尝试从缓存中查找,如果找到就直接返回,否则再去数据库查询,将结果存入缓存...