[仙子介绍] memcached及其Perl API

转载 2007年10月05日 22:30:00
原贴: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
转载请注明作者名及原文出处
 

memcached介绍及原理

memcached是一种缓存技术,存储在内存中(高性能分布式内存缓存服务器)。目的:提速。(传统的都是把数据保存在关系型数据库管理系统即RDBMS,客户端请求时会从RDBMS中读取数据并在浏览器中显示...
  • guugle2010
  • guugle2010
  • 2014年10月15日 19:17
  • 2917

memcached window版 下载安装,简单测试

memcached window版 下载安装,简单测试
  • liangrui1988
  • liangrui1988
  • 2014年12月07日 16:35
  • 1182

memcached简介和使用

memcached简介                memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、...
  • Yp5185423
  • Yp5185423
  • 2012年11月14日 14:22
  • 2802

MemCached帮助文档

MemCached帮助文档   1、安装(for Windows) memcached 1.2.4 for win32. 下载地址:http://www.splinedancer.com/me...
  • zzq19860626
  • zzq19860626
  • 2013年08月23日 13:53
  • 689

C# Memcached 使用

Memcached 使用 及.NET客户端调用 (资料整理) memcached安装: ============================================...
  • zk1782897062
  • zk1782897062
  • 2017年09月29日 09:52
  • 81

Perl基本语法

注释=pod 1.xxx 2.ddd 3.这是多行注释 =cut# this is comment 单行注释判断语句if … elsif … else my @array = (1..10); for...
  • zhubinqiang
  • zhubinqiang
  • 2015年11月23日 17:48
  • 1448

memcached for perl

用到memcached,记下 memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外...
  • hongweigg
  • hongweigg
  • 2011年04月28日 12:47
  • 1017

perl 批量添加zabbix

[root@dr-mysql01 ~]# cat zabbix.pl #!/usr/bin/perl use JSON::RPC::Client; use Data::Dumper; # Authe...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2015年12月29日 16:19
  • 551

JMS及其API介绍

Java Message Service是java ee的规范之一,可以用来发送异步消息,在某些场景下,可以作为不同系统,或者不同模块之间的集成方式。          可以类比为通过数据库来集...
  • zmx729618
  • zmx729618
  • 2016年07月19日 09:33
  • 2072

Memcached-api

1、相关类 package com.memcached.util; import java.io.Serializable; public class User implements Seria...
  • wuliu_forever
  • wuliu_forever
  • 2016年08月16日 15:03
  • 174
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[仙子介绍] memcached及其Perl API
举报原因:
原因补充:

(最多只允许输入30个字)