- 对于目前来说,使用memcache 前端缓存的公司越来越多,那么memcache的优点在哪呢?
-
其实memecached是高性能的分布式内存缓存服务器,一般使用的目的是,通过缓存数据库查询的结果(得第二次访问才能有效),减少数据库访问次数,提高动态web应用的速度,提高可扩展行。
-
memcached 作为告诉运行的分布式缓存服务器,有以下优点。
-
协议简单
-
基于libevent的事件处理
-
内置内存缓存方式
-
memcached不互相通信的分布式
-
关于libevent事件处理可以访问:http://www.monkey.org/~provos/libevent/
-
memcached 内置的内存储存方式,由于存储在内存中,重启memcached,操作系统都会导致数据丢失。还有就是当内容达到指定值后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。
-
链接memcached客户端,目前以php,perl为主。
-
1.那就先介绍下perl的链接方式
-
Perl 的memcached客户端有
-
Cache::Memcached
-
Cache::Memcached::Fast
-
Cache::Memcached::libmemcached
-
等几个CPAN模块。这里介绍的Cache::Memcached是memcached的作者Brad Fitzpatric的作品,应
-
该算是memcached的客户端中应用最为广泛的模块了,就是根据服务器太熟的余数进行分散,求得键的证书哈希值,在除以服务器台数,根据余数来选择服务器。其计算方法简单,数据的分散性也相对优秀,但是其缺点是,当添加或移除服务器时,缓存重组的代价相当巨大,添加服务器后,余数就会产生巨变,这样就无法获取与保存时间相同的服务器,从而影响缓存的命中率,那就就导致无法添加服务器。
-
为了解决这个问题,又有了新的分布式方法,现在可以轻易的添加了,这种方法称为Consistent Hashing。
-
首先求出memcached服务器(节点)的哈希值,并将其配置到0~2(32次方)的园上。然后同样的方法求出存储数据的键的哈希值,并映射到园上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上,如果超过范围仍招不到服务器,就会保存到第一台memcached服务器上。
-
由于Cache::Memcached不支持Consisitent Hashing,但以后几个客户端函数库支持。第一个支持的是名为libketama的php库,有last.fm开发。
-
Cache::Memcached::Fast 重新实现了libketama,在创建对象时就可以指定ketama_points选项。
-
my $memcached = Cache::Memcached::Fast>new({
-
servers => ["192.168.0.1:11211","192.168.0.2:11211"],
-
ketama_points => 150
-
});
-
2.Cache::Memcached的情况下,与memcached的连接(文件句柄)保存在Cache::Memcached包内的
-
类变量中。在mod_perl和FastCGI等环境下,包内的变量不会像CGI那样随时重新启动,而是在进
-
程中一直保持。其结果就是不会断开与memcached的连接,减少了TCP连接建立时的开销,同时
-
也能防止短时间内反复进行TCP连接、断开而导致的TCP端口资源枯竭。
-
但是,Cache::Memcached::Fast没有这个功能,所以需要在模块之外将Cache::Memcached::Fast对象
-
保持在类变量中,以保证持久连接。
-
-
package Gihyo::Memcached;
-
use strict;
-
use warnings;
-
use Cache::Memcached::Fast;
-
my @server_list = qw/192.168.1.1:11211 192.168.1.1:11211/;
-
my $fast; ## 用于保持对象
-
sub new {
-
my $self = bless {}, shift;
-
if ( !$fast ) {
-
$fast = Cache::Memcached::Fast>new({ servers => \@server_list });
-
}
-
$self>{_fast} = $fast;
-
return $self;
-
}
-
sub get {
-
my $self = shift;
-
$self>{_fast}>get(@_);
-
}
-
上面的例子中,Cache::Memcached::Fast对象保存到类变量$fast中。
-
3.Cache::Memcached拥有rehash功能,即在无法
-
连接保存数据的服务器的情况下,会再次计算hash值,连接其他的服务器。
-
但是,Cache::Memcached::Fast没有这个功能。不过,它能够在连接服务器失败时,短时间内不再
-
连接该服务器的功能。
-
my $fast = Cache::Memcached::Fast>new({
-
max_failures => 3,
-
failure_timeout => 1
-
});
-
在failure_timeout秒内发生max_failures以上次连接失败,就不再连接该memcached服务器。我们
-
的设置是1秒钟3次以上。
-
此外,mixi还为所有用户共享的缓存数据的键名设置命名规则,符合命名规则的数据会自动保存到
-
多台memcached服务器中,取得时从中仅选取一台服务器。创建该函数库后,就可以使memcached
-
服务器故障不再产生其他影响。
-
例子: 测试memcached 处理形式
-
#!/usr/bin/perl -w
-
use strict;
-
use warnings;
-
use Cache::Memcached;
-
-
my $key = "foo";
-
my $value = "bar";
-
my $times = 3600;
-
my $memcached = Cache::Memcached->new({
-
servers => ["127.0.0.1:11211"],
-
compress_threshold =>10_000
-
-
});
-
$memcached->add($key,$value,$times);
-
my $ret = $memcached->get($key);
-
print "$ret \n";
-
-
2.测试存储效果
-
perl]# cat mem1.pl
-
#!/usr/bin/perl -w
-
use Cache::Memcached;
-
my $memd = new Cache::Memcached{
-
'servers'=>["127.0.0.1:11211"]
-
};
-
my $val = $memd->get("my_key");
-
if($val){
-
print "Value is $val\n";
-
}
-
$memd->set("my_key","fei");
-
$memd->disconnect_all();
-
-
测试
-
perl mem1.pl
-
结果:
-
<30 new auto-negotiating client connection
-
30: Client using the ascii protocol
-
<30 get my_key
-
>30 sending key my_key 0 3
-
fei
-
-
>30 END
-
Value is fei
-
<30 set my_key 0 0 3
-
>30 STORED
-
<30 connection closed.
- 第一次没有输出,第二次输出。