Memcached在大型网站中应用.doc_第1页
Memcached在大型网站中应用.doc_第2页
Memcached在大型网站中应用.doc_第3页
Memcached在大型网站中应用.doc_第4页
Memcached在大型网站中应用.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。起初作者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统, 这种方法不仅解决了共享内存只能是单机的弊端, 同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度!基于memcached作者对分布式cache的理解和解决方案。memcached完全可以用到其他地方 比如分布式数据库, 分布式计算等领域。 1、memcached 协议理解memcache是为了加快/访问速度而诞生的一个项目。它的官方主页是:/memcached/目前在网站开发中应用较少,主要的应用有:/memcached/users.bml在国内的网站开发中,还很少没见到有应用的,中文资料十分匮乏。工作机制:通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度,和数据库是独立的。但是目前主要用来缓存数据库的数据。允许多个server通过网络形成一个大的hash,用户不必关心数据存放在哪,只调用相关接口就可。存放在内存的数据通过LRU算法进行淘汰出内存。同时可以通过删除和设置失效时间来淘汰存放在内存的数据。2、memcached 使用入门2.1 memcached的安装 ?memcached服务的安装 先检查linux内核版本,建议将memcached 安装在2.6以上。 因为memcached 需要用到libevent和 epoll 。memcached安装前首先确定你的服务器上面安装了libevent库,libevent下载地址( /provos/libevent/)。下载memcached的源码( /memcached/download.bml)。Memcached最初是用perl写的,现在的版本是用c写的。下载后拷贝到一个目录,安装需要root用户来执行tar -zxvf memcached-1.1.12.tar.gzcd memcached-1.1.12./configure这里必须先要configure, 它会检测你的系统情况,然后生成一个config.h文件和其它的几个文件,另外和其它的configure一样,你可以配置它的安装路径等等。默认应用程序安装在/usr/local/bin目录下。make /编译make install /安装memcached客户端的安装根据memcached协议,用户可以自己写出符合自己要求的客户端程序。目前/memcached/download.bml提供perl,c,java,python,php等客户端程序供下载和参考。下面我就以perl客户端程序为例说明客户端的安装:下载后拷贝到一个目录,安装需要root用户来执行tar -zxvf Cache-Memcached-1.14.tar.gzcd Cache-Memcached-1.14perl makefile.plmakemake installmake test这样就安装好了memcahced, 启动memcached就可使用分布式缓存系统了!2.2 快速入门 memcached服务的启动 memcached的启动非常简单,它没有配置文件,只要配置好几个参数就可以使用了。下面我以一个实际应用的例子,具体说明一下:memcached d m 500 -l 51 -p 11211 -vv /var/www/kelly/test/logs/memcached_$.log启动的这个memcached为一个后台守护进程模式(-d), 然后缓存的空间为500M(-m), 监听(-l)服务器5的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,这样可以在服务器启动时候执行。 memcached客户端的连接下面我就以perl客户端程序为例说明客户端的连接:启动两个memcached servermemcached d m 500 -l 51 -p 11211 -vv /var/www/kelly/test/logs/memcached_$.logmemcached d m 500 -l 51 -p 11212 -vv /var/www/kelly/test/logs/memcached_$.logperl客户端程序#!/usr/bin/perluse Cache:Memcached;my $memd = new Cache:Memcached servers = 5:11211 , 5:11212, ;my $val = $memd-get( my_key );if ( $val ) print Value is $valn;# Set a value$memd-set(my_key, 123);$memd-disconnect_all();?运行测试$ perl test-memcache.pl$ perl test-memcache.plValue is 123可以看到,第一次没有取得my_key,第二次从memcached中得到my_key的值。同时通过查看日志,可以发现的确存储在两个memcache server中。这个简单的例子,解释了如何在memcached中存取数据,以及memcache是真正的分布式缓存系统。当然,这还只是很简单的例子,体现不出memcache的优势,下面将通过一个很具体的例子,给出详细的应用。3、memcached在Zorpia的应用 是一个网页相册,博客,交友,论坛的大型网站公司。现在已有超过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_keymy $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 charactersif (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_keymy $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 kellymy $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 *

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论