原贴:http://www.chinaunix.net/jh/25/899526.html
[保留] [仙子介绍] memcached及其Perl API |
---|
|
http://www.chinaunix.net 作者:兰花仙子 发表于:2007-02-26 14:13:48 |
【发表评论】 【查看原文】 【Perl讨论区】【关闭】 |
仙子注: 引用:这篇文档是偶很早前写的,并且偶一直也在用memcached.现把它贴出来大家共享下. memcached,主页在http://www.danga.com/memcached/,是一项开源技术。 memcached是用C写的一个daemon程序,在Linux下支持epoll。运行方法很简单: ./memcached -d -m 1024 -l 192.168.1.102 -p 7789 ./memcached -d -m 1024 -l 192.168.1.102 -p 7790 这表示在同一机器上运行2个memcached,每个使用1G内存,一个侦听在7789端口,一个侦听在7790端口。这样可以实现负载均衡,并 且一个daemon down掉了,数据会继续在另一个daemon里读写。而真正分布式的应用体现在多主机,多daemon上,就是说完全可以这样运 行: ./memcached -d -m 1024 -l 1.1.1.1 -p 1111 ./memcached -d -m 1024 -l 1.1.1.1 -p 2222 ./memcached -d -m 1024 -l 2.2.2.2 -p 1111 ./memcached -d -m 1024 -l 2.2.2.2 -p 2222 .... 直到无穷。 这样可以实现高效的负载均衡。在web主机上,通常web进程(如Apache)是CPU敏感,内存不那么敏感的。而memcached典型的是 耗内存不耗CPU。因此可将memcached直接跑在前台web主机上,作为数据缓存(或数据库连接池)使用,也就是在web程序与数据库之间多加了一 层。 memcached的通信协议是透明的,完全可以根据文档写出自己的API。当然已有现成的Perl和C API。测试了下Perl API,非 常容易实现数据的cache,并且性能很好。用这个memcached既可以实现Mysql的连接缓冲池,又可以代替DB_File作为本地数据 Cache。 写了个测试脚本如下: #!/usr/bin/perl
use strict;
use Data::Dumper;
use DBI;
use Cache::Memcached;
my $host='192.168.1.101';
my $dbuser='xxx';
my $dbpasswd='***';
my $db='mydb';
my $dsn="dbi:mysql:$db:$host";
my $dbh=DBI->connect($dsn,$dbuser,$dbpasswd,{PrintError => 1,RaiseError => 0});
my $test_id=423147;
my $memd = new Cache::Memcached {
'servers' => [ "192.168.1.102:7789", "192.168.1.102:7790" ],
'debug' => 0,
'compress_threshold' => 10_000,
};
my $val;
$val = init_object($test_id);
print Dumper $val;
repl_object($test_id);
$val = get_object($test_id);
print Dumper $val;
$val = incr_object($test_id);
print Dumper $val;
$val = incr_object($test_id);
print Dumper $val;
if (del_object($test_id)){
my $val = get_object($test_id);
print Dumper $val;
}
print Dumper $memd->stats('misc');
$memd->disconnect_all;
#----------------
# test subroutines
#
sub init_object {
my $foo_id = shift;
my $obj = $memd->get("foo:$foo_id");
return $obj if $obj;
my $query="select mailfrom,sendtime,subject from rcpt where id=$foo_id";
$obj = $dbh->selectrow_hashref($query);
$memd->set("foo:$foo_id", $obj);
return $obj;
}
sub get_object {
my $foo_id = shift;
my $obj = $memd->get("foo:$foo_id");
return $obj;
}
sub del_object {
my $foo_id = shift;
$memd->delete("foo:$foo_id");
}
sub repl_object {
my $foo_id = shift;
my $query="select mailfrom,sendtime,subject from rcpt where id=423148";
my $obj = $dbh->selectrow_hashref($query);
$memd->replace("foo:$foo_id", $obj);
}
sub incr_object {
my $foo_id = shift;
$memd->incr("foo:$foo_id");
} 可以看到关键是此处陈述: my $memd = new Cache::Memcached {
'servers' => [ "192.168.1.102:7789", "192.168.1.102:7790" ],
'debug' => 0,
'compress_threshold' => 10_000,
}; 这里定义了所有memcached的地址和端口列表。应用程序根据key将数据存放到对应的memcached上。当然数据不是随机存放的,否则 查找会很低效。应该是不同的key到不同的daemon之间有个映射算法,这样数据在存取完后可快速访问到,而不是要遍历所有的daemon才能找到. 当然这个API里也定义了很多操作memcached数据的方法,包括增加、删除、更新、替换等,非常灵活。具体的Perl-API接口可见CPAN上Cache::Memcached的POD文档。 网上的测试表明,该技术强于当前的共享内存以及Mysql Cache,Mysql Duplicate技术。livejournal的2K万用户访问量,就是用它来提速的。Slashdot站点也采用了该技术。
大大狗 回复于:2007-02-13 11:03:23
学习:)
helbreathszw 回复于:2007-02-13 11:05:42
memcached都啥年代的老掉牙冬冬了 因为数据库的缓冲没人仔细去研究 像搜狐就是一个大牛搞了一个数据库缓冲池,5000行C代码就搞定了
helbreathszw 回复于:2007-02-13 11:35:58
顺便提一下livejournal的世界排名Rank70,sohu是16
gsging 回复于:2007-02-13 16:13:08
引用:原帖由 兰花仙子 于 2007-2-13 10:40 发表 当然数据不是随机存放的,否则查找会很低效。应该是不同的key到不同的daemon之间有个映射算法,这样数据在存取完后可快速访问到,而不是要遍历所有的daemon才能找到.
請問仙子,這個算法是需要自己實現還是由Memcached實現的?
兰花仙子 回复于:2007-02-13 16:31:33
引用:原帖由 gsging 于 2007-2-13 16:13 发表 請問仙子,這個算法是需要自己實現還是由Memcached實現的? memcached自己决定的,你不用去管它.它自己会根据Key找到对应的节点.
xiaoshengcaicai 回复于:2007-02-14 13:01:14
引用:原帖由 helbreathszw 于 2007-2-13 11:05 发表 memcached都啥年代的老掉牙冬冬了 因为数据库的缓冲没人仔细去研究 像搜狐就是一个大牛搞了一个数据库缓冲池,5000行C代码就搞定了 ....存在就是有价值, 不知道阁下是用什么缓冲技术的? 莫非你就是传说中SOHU的那个大牛?
helbreathszw 回复于:2007-02-14 13:20:04
拜托,俺是在搜狐的竞争死敌新浪
兰花仙子 回复于:2007-02-14 13:42:07
引用:原帖由 helbreathszw 于 2007-2-14 13:20 发表 拜托,俺是在搜狐的竞争死敌新浪 你还是多回读下这个帖子,思量下自己的不足先吧,不要老在这里挑三拣四. http://bbs.chinaunix.net/viewthread.php?tid=880365&page=2#pid6254055
helbreathszw 回复于:2007-02-14 13:58:42
呵呵,难道斑竹又忘了perl的三大美德 骄傲,懒惰,没耐性 学perl之路,受别人指点不如直接读sourceforge的开源项目如webmin 与其听斑竹的什么简简单单讲xxx,不如perldoc xxx 或是man xxx 还有什么斑竹的写的所谓的xxx脚本,不如直接去www.google.com/codesearch 斑竹仙子可能做的最大的贡献,就是给不懂英文的朋友充当翻译 请问仙子斑竹在cpan有什么模块是你贡献的?那个可能要求太严了,但是做个RPM包应该不成问题吧 你又做过那些包呢? 还有你因为没有读过perl圣贤的代码而写的那些代码脚本就不要提了,难道这就是一个喝过洋墨水的海龟所 有的才能了? 实在没瞧出来留过洋有什么比土鳖不同的地方?
[ 本帖最后由 helbreathszw 于 2007-2-14 14:17 编辑 ]
兰花仙子 回复于:2007-02-14 14:43:47
引用:原帖由 helbreathszw 于 2007-2-14 13:58 发表 呵呵,难道斑竹又忘了perl的三大美德 骄傲,懒惰,没耐性 学perl之路,受别人指点不如直接读sourceforge的开源项目如webmin 与其听斑竹的什么简简单单讲xxx,不如perldoc xxx 或是man xxx 还有什么斑竹的写的所 ... 偶没写过任何CPAN模块,但偶从不会随便对别人写的东西挑三拣四. 不知你所谓的圣贤代码又是怎么回事?写一段别人看不懂的东西,就很圣贤了么? 从没这个你这样欺软怕硬的人.前段时间大家都期待你出现的时候,躲哪里去了呢? 无语+BS,Hmm!!
helbreathszw 回复于:2007-02-14 14:46:31
那段时间,俺在设计公司的数据库集群系统2.0 hoho
helbreathszw 回复于:2007-02-14 14:47:35
过完年开始做大型压力测试 哈哈,我都做成了RPM包,方便又实用!
hmilymb 回复于:2007-02-14 15:23:57
引用:原帖由 helbreathszw 于 2007-2-14 14:47 发表 过完年开始做大型压力测试 哈哈,我都做成了RPM包,方便又实用! 荣耀什么,看不起你这种人。极度鄙视。
IBMSAN 回复于:2007-02-14 16:53:42
引用:原帖由 helbreathszw 于 2007-2-14 14:46 发表 那段时间,俺在设计公司的数据库集群系统2.0 hoho 牛X,有本事把你设计的数据库集群系统拉出来遛遛!!
james.liu 回复于:2007-02-25 15:32:40
引用: 网上的测试表明,该技术强于当前的共享内存以及Mysql Cache,Mysql Duplicate技术。livejournal的2K万用户访问量,就是用它来提速的。
哦,是吗?
langq235 回复于:2007-02-26 14:13:48
好回帖
| | 原文链接:http://bbs.chinaunix.net/viewthread.php?tid=899526 转载请注明作者名及原文出处 | |