[仙子介绍] memcached及其Perl API

原贴: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
转载请注明作者名及原文出处
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值