您的位置:首页 > 数据库 > Memcache

[仙子介绍] memcached及其Perl API

2007-10-05 22:30 423 查看
原贴: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
转载请注明作者名及原文出处
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: