memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。起初作者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统, 这种方法不仅解决了共享内存只能是单机的弊端, 同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度!基于memcached作者对分布式cache的理解和解决方案。memcached完全可以用到其他地方 比如分布式数据库, 分布式计算等领域。
1 memcached 协议理解
memcache是为了加快www.livejournal/访问速度而诞生的一个项目。
它的官方主页是:www.danga/memcached/
目前在网站开发中应用较少,主要的应用有:
www.danga/memcached/users.bml
在国内的网站开发中,还很少没见到有应用的,中文资料十分匮乏。
工作机制:通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度,和数据
库是独立的。但是目前主要用来缓存数据库的数据。允许多个server通过网络形成一个大的hash,用户不必关心数据存放在哪,只调用相关接口就可。存放在内存的数据通过LRU算法进行淘汰出内存。同时可以通过删除和设置失效时间来淘汰存放在内存的数据。
2 memcached 使用入门
2.1 memcached的安装
  ?<1>memcached服务的安装
  先检查linux内核版本,建议将memcached 安装在2.6以上。
  因为memcached 需要用到libevent epoll
memcached安装前首先确定你的服务器上面安装了libevent库,网站程序下载
libevent下载地址( /~provos/libevent/)。
下载memcached的源码( www.danga/memcached/download.bml)。
Memcached最初是用perl写的,现在的版本是用c写的。
下载后拷贝到一个目录,安装需要root用户来执行
tar -zxvf memcached-1.1.
cd memcached-1.1.12
.
/configure
这里必须先要configure, 它会检测你的系统情况,然后生成一个config.h文件和其它的几个文件,另外和其它的configure一样,你可以配置它的安装路径等等。默认应用程序安装在/usr/local/bin目录下。
make //编译
make install //安装
<2>memcached客户端的安装
根据memcached协议,用户可以自己写出符合自己要求的客户端程序。目前www.danga/memcached/download.bml
提供perl,c,java,python,php等客户端程序供下载和参考。下面我就以perl客户端程序为例说明客户端的安装:
下载后拷贝到一个目录,安装需要root用户来执行
tar -zxvf Cache-Memcached-1.
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.1511211号端口(-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 memcachedZorpia的应用
pia 是一个网页相册,博客,交友,论坛的大型网站公司。现在已有超过140万活跃使用者遍布美国,香港,东南亚,欧洲,澳洲,亚洲等其它地区。每天的访问量都在增长,已成为全世界排名第五的社会生活关系网。
Memcached也采用了memcached来提高网站的访问速度,并且取得了很好的效果,我在负责zorpiamemcached项目时候积累了一些经验,主要的做法如下:
1 通过对memcacheperl客户端进行包装,定制自己的客户端。
2 通过制定符合zorpia规范的hash key命名规范
?  ? memcache中需要存储的内容的key均由string组成。
这个string统一由一个memcache.pmsubroutine来实现。(假设这个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结构,也由程序员按照规则制定

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。