免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 12676 | 回复: 26
打印 上一主题 下一主题

[仙子介绍] memcached及其Perl API [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-13 10:40 |只看该作者 |倒序浏览
仙子注:
这篇文档是偶很早前写的,并且偶一直也在用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。

写了个测试脚本如下:

  1. #!/usr/bin/perl
  2. use strict;
  3. use Data::Dumper;
  4. use DBI;
  5. use Cache::Memcached;

  6. my $host='192.168.1.101';
  7. my $dbuser='xxx';
  8. my $dbpasswd='***';
  9. my $db='mydb';

  10. my $dsn="dbi:mysql:$db:$host";
  11. my $dbh=DBI->connect($dsn,$dbuser,$dbpasswd,{PrintError => 1,RaiseError => 0});
  12. my $test_id=423147;

  13. my $memd = new Cache::Memcached {
  14.     'servers' => [ "192.168.1.102:7789", "192.168.1.102:7790" ],
  15.     'debug' => 0,
  16.     'compress_threshold' => 10_000,
  17. };

  18. my $val;
  19. $val = init_object($test_id);
  20. print Dumper $val;

  21. repl_object($test_id);
  22. $val = get_object($test_id);
  23. print Dumper $val;

  24. $val = incr_object($test_id);
  25. print Dumper $val;
  26. $val = incr_object($test_id);
  27. print Dumper $val;

  28. if (del_object($test_id)){
  29.     my $val = get_object($test_id);
  30.     print Dumper $val;
  31. }


  32. print Dumper $memd->stats('misc');
  33. $memd->disconnect_all;

  34. #----------------
  35. # test subroutines
  36. #

  37. sub init_object {
  38.    my $foo_id = shift;
  39.    my $obj = $memd->get("foo:$foo_id");
  40.    return $obj if $obj;

  41.    my $query="select mailfrom,sendtime,subject from rcpt where id=$foo_id";
  42.    $obj = $dbh->selectrow_hashref($query);
  43.    $memd->set("foo:$foo_id", $obj);
  44.    return $obj;
  45. }

  46. sub get_object {
  47.    my $foo_id = shift;
  48.    my $obj = $memd->get("foo:$foo_id");
  49.    return $obj;
  50. }

  51. sub del_object {
  52.    my $foo_id = shift;
  53.    $memd->delete("foo:$foo_id");
  54. }

  55. sub repl_object {
  56.    my $foo_id = shift;
  57.    my $query="select mailfrom,sendtime,subject from rcpt where id=423148";
  58.    my $obj = $dbh->selectrow_hashref($query);

  59.    $memd->replace("foo:$foo_id", $obj);
  60. }

  61. sub incr_object {
  62.    my $foo_id = shift;
  63.    $memd->incr("foo:$foo_id");
  64. }
复制代码



可以看到关键是此处陈述:

  1. my $memd = new Cache::Memcached {
  2.     'servers' => [ "192.168.1.102:7789", "192.168.1.102:7790" ],
  3.     'debug' => 0,
  4.     'compress_threshold' => 10_000,
  5. };
复制代码


这里定义了所有memcached的地址和端口列表。应用程序根据key将数据存放到对应的memcached上。当然数据不是随机存放的,否则查找会很低效。应该是不同的key到不同的daemon之间有个映射算法,这样数据在存取完后可快速访问到,而不是要遍历所有的daemon才能找到.

当然这个API里也定义了很多操作memcached数据的方法,包括增加、删除、更新、替换等,非常灵活。具体的Perl-API接口可见CPAN上Cache::Memcached的POD文档。

网上的测试表明,该技术强于当前的共享内存以及Mysql Cache,Mysql Duplicate技术。livejournal的2K万用户访问量,就是用它来提速的。Slashdot站点也采用了该技术。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-02-13 11:03 |只看该作者
学习

论坛徽章:
0
3 [报告]
发表于 2007-02-13 11:05 |只看该作者
memcached都啥年代的老掉牙冬冬了
因为数据库的缓冲没人仔细去研究
像搜狐就是一个大牛搞了一个数据库缓冲池,5000行C代码就搞定了

论坛徽章:
0
4 [报告]
发表于 2007-02-13 11:35 |只看该作者
顺便提一下livejournal的世界排名Rank70,sohu是16

论坛徽章:
0
5 [报告]
发表于 2007-02-13 16:13 |只看该作者
原帖由 兰花仙子 于 2007-2-13 10:40 发表
当然数据不是随机存放的,否则查找会很低效。应该是不同的key到不同的daemon之间有个映射算法,这样数据在存取完后可快速访问到,而不是要遍历所有的daemon才能找到.


請問仙子,這個算法是需要自己實現還是由Memcached實現的?

论坛徽章:
0
6 [报告]
发表于 2007-02-13 16:31 |只看该作者
原帖由 gsging 于 2007-2-13 16:13 发表


請問仙子,這個算法是需要自己實現還是由Memcached實現的?


memcached自己决定的,你不用去管它.它自己会根据Key找到对应的节点.

论坛徽章:
0
7 [报告]
发表于 2007-02-14 13:01 |只看该作者
原帖由 helbreathszw 于 2007-2-13 11:05 发表
memcached都啥年代的老掉牙冬冬了
因为数据库的缓冲没人仔细去研究
像搜狐就是一个大牛搞了一个数据库缓冲池,5000行C代码就搞定了


....存在就是有价值, 不知道阁下是用什么缓冲技术的? 莫非你就是传说中SOHU的那个大牛?

论坛徽章:
0
8 [报告]
发表于 2007-02-14 13:20 |只看该作者
拜托,俺是在搜狐的竞争死敌新浪

论坛徽章:
0
9 [报告]
发表于 2007-02-14 13:42 |只看该作者
原帖由 helbreathszw 于 2007-2-14 13:20 发表
拜托,俺是在搜狐的竞争死敌新浪


你还是多回读下这个帖子,思量下自己的不足先吧,不要老在这里挑三拣四.
http://bbs.chinaunix.net/viewthr ... p;page=2#pid6254055

论坛徽章:
0
10 [报告]
发表于 2007-02-14 13:58 |只看该作者
呵呵,难道斑竹又忘了perl的三大美德
骄傲,懒惰,没耐性
学perl之路,受别人指点不如直接读sourceforge的开源项目如webmin
与其听斑竹的什么简简单单讲xxx,不如perldoc xxx 或是man xxx
还有什么斑竹的写的所谓的xxx脚本,不如直接去www.google.com/codesearch
斑竹仙子可能做的最大的贡献,就是给不懂英文的朋友充当翻译
请问仙子斑竹在cpan有什么模块是你贡献的?那个可能要求太严了,但是做个RPM包应该不成问题吧
你又做过那些包呢?
还有你因为没有读过perl圣贤的代码而写的那些代码脚本就不要提了,难道这就是一个喝过洋墨水的海龟所
有的才能了?
实在没瞧出来留过洋有什么比土鳖不同的地方?

[ 本帖最后由 helbreathszw 于 2007-2-14 14:17 编辑 ]

评分

参与人数 1可用积分 -5 信誉积分 -1 收起 理由
flw -5 -1 言辞不当,稍示惩戒。

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP