参考:http://kb.cnblogs.com/page/42733/
Memcached是一个免费开源、高性能、分布式的内存对象缓存系统。Memcached是在内存中,为特定数据(字符串或对象)构建key-value的小块数据存储。
memcached支持许多平台。
另外也能安装在Windows上。
运行memcached需要本文开头介绍的libevent库。Fedora 8中有现成的rpm包,通过yum命令安装即可。
$ sudo yum install libevent libevent-devel
然后下解压安装libevent
wget http:
//memcached
.googlecode.com
/files/memcached-1
.4.15.
tar
.gz
wget https:
//github
.com
/downloads/libevent/libevent/libevent-2
.0.21-stable.
tar
.gz
查看libevent是否安装成功
.
/configure
-prefix=
/usr/local/
make
make
install
123456789101112131415161718192021[dongji@localhost libevent-2.0.21-stable]$
ls
/usr/local/lib
|
grep
libevent
libevent-2.0.so.5
libevent-2.0.so.5.1.9
libevent.a
libevent_core-2.0.so.5
libevent_core-2.0.so.5.1.9
libevent_core.a
libevent_core.la
libevent_core.so
libevent_extra-2.0.so.5
libevent_extra-2.0.so.5.1.9
libevent_extra.a
libevent_extra.la
libevent_extra.so
libevent.la
libevent_pthreads-2.0.so.5
libevent_pthreads-2.0.so.5.1.9
libevent_pthreads.a
libevent_pthreads.la
libevent_pthreads.so
libevent.so
memcached的源代码可以从memcached网站上下载。本文执笔时的最新版本为1.2.5。 Fedora 8虽然也包含了memcached的rpm,但版本比较老。因为源代码安装并不困难,这里就不使用rpm了。
memcached安装与一般应用程序相同,configure、make、make install就行了。
$ wget http://www.danga.com/memcached/dist/memcached-1.2.5.tar.gz $ tar zxf memcached-1.2.5.tar.gz $ cd memcached-1.2.5 $.
/configure
-prefix=
/usr/local/
$ make $ make install
默认情况下memcached安装到/usr/local/bin下。
从终端输入以下命令,启动memcached。
$ /usr/local/bin/memcached -p 11211 -m 64m -vv slab class 1: chunk size 88 perslab 11915 slab class 2: chunk size 112 perslab 9362 slab class 3: chunk size 144 perslab 7281 中间省略 slab class 38: chunk size 391224 perslab 2 slab class 39: chunk size 489032 perslab 2 <23 server listening <24 send buffer was 110592, now 268435456 <24 server listening (udp) <24 server listening (udp) <24 server listening (udp) <24 server listening (udp)
这里显示了调试信息。这样就在前台启动了memcached,监听TCP端口11211 最大内存使用量为64M。调试信息的内容大部分是关于存储的信息,下次连载时具体说明。
作为daemon后台启动时,只需
$ /usr/local/bin/memcached -p 11211 -m 64m -d
这里使用的memcached启动选项的内容如下。
选项 | 说明 |
-p | 使用的TCP端口。默认为11211 |
-m | 最大内存大小。默认为64M |
-vv | 用very vrebose模式启动,调试信息和错误输出到控制台 |
-d | 作为daemon在后台启动 |
上面四个是常用的启动选项,其他还有很多,通过
$ /usr/local/bin/memcached -h
如果启动时出现“memcached: error while loading shared libraries:libevent-2.0.so.5: cannot
open shared object file: No such file or directory”之类的信息,表示memcached 找不到
libevent 的位置 所以,请先使用whereis libevent 得到位置,然后连接到memcached 所寻找的路径 首先查看,libevent 在哪里 # whereis libevent libevent: /usr/local/lib/libevent.la /usr/local/lib/libevent.so /usr/local/lib/libevent.a 然后,再看memcached 从哪里找它 # LD_DEBUG=libs memcached -v 2>&1 > /dev/null | less 可以看到:是/usr/lib/libevent-2.0.so.5,所以,创建软链
On a 32 bit system:
ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5
On a 64 bit system:
ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
再次启动关闭memcached :pkill memcached
下面的源代码为通过Cache::Memcached连接刚才启动的memcached的例子。
#!/usr/bin/perl use strict; use warnings; use Cache::Memcached; my $key = "foo"; my $value = "bar"; my $expires = 3600; # 1 hour my $memcached = Cache::Memcached->new({ servers => ["127.0.0.1:11211"], compress_threshold => 10_000 }); $memcached->add($key, $value, $expires); my $ret = $memcached->get($key); print "$ret\n";
在这里,为Cache::Memcached指定了memcached服务器的IP地址和一个选项,以生成实例。 Cache::Memcached常用的选项如下所示。
选项 | 说明 |
servers | 用数组指定memcached服务器和端口 |
compress_threshold | 数据压缩时使用的值 |
namespace | 指定添加到键的前缀 |
另外,Cache::Memcached通过Storable模块可以将Perl的复杂数据序列化之后再保存,因此散列、数组、对象等都可以直接保存到memcached中。
向memcached保存数据的方法有
它们的使用方法都相同:
my $add = $memcached->add( '键', '值', '期限' ); my $replace = $memcached->replace( '键', '值', '期限' ); my $set = $memcached->set( '键', '值', '期限' );
向memcached保存数据时可以指定期限(秒)。不指定期限时,memcached按照LRU算法保存数据。这三个方法的区别如下:
选项 | 说明 |
add | 仅当存储空间中不存在键相同的数据时才保存 |
replace | 仅当存储空间中存在键相同的数据时才保存 |
set | 与add和replace不同,无论何时都保存 |
获取数据可以使用get和get_multi方法。
my $val = $memcached->get('键'); my $val = $memcached->get_multi('键1', '键2', '键3', '键4', '键5');
一次取得多条数据时使用get_multi。get_multi可以非同步地同时取得多个键值,其速度要比循环调用get快数十倍。
删除数据使用delete方法,不过它有个独特的功能。
$memcached->delete('键', '阻塞时间(秒)');
删除第一个参数指定的键的数据。第二个参数指定一个时间值,可以禁止使用同样的键保存新数据。此功能可以用于防止缓存数据的不完整。但是要注意,set函数忽视该阻塞,照常保存数据