ÎÒÊÇmixiÖêʽ»áÉ翪·¢²¿ÏµÍ³ÔËÓª×éµÄ³¤Ò°¡£
ÈÕ³£¸ºÔð³ÌÐòµÄÔËÓª¡£´Ó½ñÌ쿪ʼ£¬½«·Ö¼¸´ÎÕë¶Ô×î½üÔÚWebÓ¦ÓõĿÉÀ©Õ¹ÐÔÁìÓò µÄÈÈÃÅ»°Ìâmemcached£¬ÓëÎÒ¹«Ë¾¿ª·¢²¿Ñо¿¿ª·¢×éµÄǰÛàÒ»Æð£¬
˵Ã÷ÆäÄÚ²¿½á¹¹ºÍʹÓá£
memcachedÊÇʲô£¿
memcached ÊÇÒÔLiveJournal ÆìÏÂDanga Interactive
¹«Ë¾µÄBrad Fitzpatric ΪÊ׿ª·¢µÄÒ»¿îÈí¼þ¡£ÏÖÔÚÒѳÉΪ mixi¡¢ hatena¡¢ Facebook¡¢
Vox¡¢LiveJournalµÈÖÚ¶à·þÎñÖÐ Ìá¸ßWebÓ¦ÓÃÀ©Õ¹ÐÔµÄÖØÒªÒòËØ¡£
Ðí¶àWebÓ¦Óö¼½«Êý¾Ý±£´æµ½RDBMSÖУ¬Ó¦Ó÷þÎñÆ÷´ÓÖжÁÈ¡Êý¾Ý²¢ÔÚä¯ÀÀÆ÷ÖÐÏÔʾ¡£
µ«Ëæ×ÅÊý¾ÝÁ¿µÄÔö´ó¡¢·ÃÎʵļ¯ÖУ¬¾Í»á³öÏÖRDBMSµÄ¸ºµ£¼ÓÖØ¡¢Êý¾Ý¿âÏìÓ¦¶ñ»¯¡¢ ÍøÕ¾ÏÔʾÑÓ³ÙµÈÖØ´óÓ°Ïì¡£
Õâʱ¾Í¸Ãmemcached´óÏÔÉíÊÖÁË¡£memcachedÊǸßÐÔÄܵķֲ¼Ê½Äڴ滺´æ·þÎñÆ÷¡£
Ò»°ãµÄʹÓÃÄ¿µÄÊÇ£¬Í¨¹ý»º´æÊý¾Ý¿â²éѯ½á¹û£¬¼õÉÙÊý¾Ý¿â·ÃÎÊ´ÎÊý£¬ÒÔÌá¸ß¶¯Ì¬WebÓ¦ÓõÄËÙ¶È¡¢ Ìá¸ß¿ÉÀ©Õ¹ÐÔ¡£

ͼ1 Ò»°ãÇé¿öÏÂmemcachedµÄÓÃ;
memcachedµÄÌØÕ÷
memcached×÷Ϊ¸ßËÙÔËÐеķֲ¼Ê½»º´æ·þÎñÆ÷£¬¾ßÓÐÒÔϵÄÌØµã¡£
1.ÐÒé¼òµ¥
2.»ùÓÚlibeventµÄʼþ´¦Àí
3.ÄÚÖÃÄÚ´æ´æ´¢·½Ê½
4.memcached²»»¥ÏàͨÐŵķֲ¼Ê½
ÐÒé¼òµ¥
memcachedµÄ·þÎñÆ÷¿Í»§¶ËͨÐŲ¢²»Ê¹Óø´ÔÓµÄXMLµÈ¸ñʽ£¬ ¶øÊ¹Óüòµ¥µÄ»ùÓÚÎı¾ÐеÄÐÒé¡£Òò´Ë£¬Í¨¹ýtelnet
Ò²ÄÜÔÚmemcachedÉϱ£´æÊý¾Ý¡¢È¡µÃÊý¾Ý¡£ÏÂÃæÊÇÀý×Ó¡£
$ telnet localhost 11211 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. set foo 0 0 3 £¨±£´æÃüÁ bar £¨Êý¾Ý£© STORED £¨½á¹û£© get foo £¨È¡µÃÃüÁ VALUE foo 0 3 £¨Êý¾Ý£© bar £¨Êý¾Ý£© |
ÐÒéÎĵµÎ»ÓÚmemcachedµÄÔ´´úÂëÄÚ£¬Ò²¿ÉÒԲο¼ÒÔϵÄURL¡£
http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt |
»ùÓÚlibeventµÄʼþ´¦Àí
libeventÊǸö³ÌÐò¿â£¬Ëü½«LinuxµÄepoll¡¢BSDÀà²Ù×÷ϵͳµÄkqueueµÈʼþ´¦Àí¹¦ÄÜ
·â×°³ÉͳһµÄ½Ó¿Ú¡£¼´Ê¹¶Ô·þÎñÆ÷µÄÁ¬½ÓÊýÔö¼Ó£¬Ò²ÄÜ·¢»ÓO(1)µÄÐÔÄÜ¡£ memcachedʹÓÃÕâ¸ölibevent¿â£¬Òò´ËÄÜÔÚLinux¡¢BSD¡¢SolarisµÈ²Ù×÷ϵͳÉÏ·¢»ÓÆä¸ßÐÔÄÜ¡£
¹ØÓÚʼþ´¦ÀíÕâÀï¾Í²»ÔÙÏêϸ½éÉÜ£¬¿ÉÒԲο¼Dan KegelµÄThe C10K Problem¡£
http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt |
ÄÚÖÃÄÚ´æ´æ´¢·½Ê½
ΪÁËÌá¸ßÐÔÄÜ£¬memcachedÖб£´æµÄÊý¾Ý¶¼´æ´¢ÔÚmemcachedÄÚÖõÄÄÚ´æ´æ´¢¿Õ¼äÖС£
ÓÉÓÚÊý¾Ý½ö´æÔÚÓÚÄÚ´æÖУ¬Òò´ËÖØÆômemcached¡¢ÖØÆô²Ù×÷ϵͳ»áµ¼ÖÂÈ«²¿Êý¾ÝÏûʧ¡£ ÁíÍ⣬ÄÚÈÝÈÝÁ¿´ïµ½Ö¸¶¨ÖµÖ®ºó£¬¾Í»ùÓÚLRU(Least
Recently Used)Ëã·¨×Ô¶¯É¾³ý²»Ê¹ÓõĻº´æ¡£ memcached±¾ÉíÊÇΪ»º´æ¶øÉè¼ÆµÄ·þÎñÆ÷£¬Òò´Ë²¢Ã»Óйý¶à¿¼ÂÇÊý¾ÝµÄÓÀ¾ÃÐÔÎÊÌâ¡£
¹ØÓÚÄÚ´æ´æ´¢µÄÏêϸÐÅÏ¢£¬±¾Á¬Ôصĵڶþ½²ÒÔºóǰÛà»á½øÐнéÉÜ£¬Çë½ìʱ²Î¿¼¡£
memcached²»»¥ÏàͨÐŵķֲ¼Ê½
memcached¾¡¹ÜÊÇ¡°·Ö²¼Ê½¡±»º´æ·þÎñÆ÷£¬µ«·þÎñÆ÷¶Ë²¢Ã»Óзֲ¼Ê½¹¦ÄÜ¡£
¸÷¸ömemcached²»»á»¥ÏàͨÐÅÒÔ¹²ÏíÐÅÏ¢¡£ÄÇô£¬ÔõÑù½øÐзֲ¼Ê½ÄØ£¿ ÕâÍêȫȡ¾öÓÚ¿Í»§¶ËµÄʵÏÖ¡£±¾Á¬ÔØÒ²½«½éÉÜmemcachedµÄ·Ö²¼Ê½¡£

ͼ2 memcachedµÄ·Ö²¼Ê½
½ÓÏÂÀ´¼òµ¥½éÉÜÒ»ÏÂmemcachedµÄʹÓ÷½·¨¡£
°²×°memcached
memcachedµÄ°²×°±È½Ï¼òµ¥£¬ÕâÀïÉÔ¼Ó˵Ã÷¡£
memcachedÖ§³ÖÐí¶àƽ̨¡£
1.Linux
2.FreeBSD
3.Solaris (memcached 1.2.5ÒÔÉϰ汾)
4.Mac OS X
ÁíÍâÒ²Äܰ²×°ÔÚWindowsÉÏ¡£ÕâÀïʹÓÃFedora Core 8½øÐÐ˵Ã÷¡£
memcachedµÄ°²×°
ÔËÐÐmemcachedÐèÒª±¾ÎÄ¿ªÍ·½éÉܵÄlibevent¿â¡£Fedora 8ÖÐÓÐÏֳɵÄrpm°ü£¬ ͨ¹ýyumÃüÁî°²×°¼´¿É¡£
$ sudo yum install libevent libevent-devel |
memcachedµÄÔ´´úÂë¿ÉÒÔ´ÓmemcachedÍøÕ¾ÉÏÏÂÔØ¡£±¾ÎÄÖ´±ÊʱµÄ×îа汾Ϊ1.2.5¡£ Fedora
8ËäȻҲ°üº¬ÁËmemcachedµÄrpm£¬µ«°æ±¾±È½ÏÀÏ¡£ÒòΪԴ´úÂë°²×°²¢²»À§ÄÑ£¬ ÕâÀï¾Í²»Ê¹ÓÃrpmÁË¡£
ÏÂÔØmemcached£ºhttp://www.danga.com/memcached/download.bml
memcached°²×°ÓëÒ»°ãÓ¦ÓóÌÐòÏàͬ£¬configure¡¢make¡¢make install¾ÍÐÐÁË¡£
$ wget http://www.danga.com/memcached/dist/memcached-1.2.5.tar.gz $ tar zxf memcached-1.2.5.tar.gz $ cd memcached-1.2.5 $ ./configure $ make $ sudo make install |
ĬÈÏÇé¿öÏÂmemcached°²×°µ½/usr/local/binÏ¡£
memcachedµÄÆô¶¯
´ÓÖÕ¶ËÊäÈëÒÔÏÂÃüÁÆô¶¯memcached¡£
$ /usr/local/bin/memcached -p 11211 -m 64m -vv slab class 1: chunk size 88 perslab 11915 slab class 2: chunk size 112 perslab 9362 slab class 3: chunk size 144 perslab 7281 |
ÖмäÊ¡ÂÔ
slab class 38: chunk size 391224 perslab 2 slab class 39: chunk size 489032 perslab 2 <23 server listening <24 send buffer was 110592, now 268435456 <24 server listening (udp) <24 server listening (udp) <24 server listening (udp) <24 server listening (udp) |
ÕâÀïÏÔʾÁ˵÷ÊÔÐÅÏ¢¡£ÕâÑù¾ÍÔÚǰ̨Æô¶¯ÁËmemcached£¬¼àÌýTCP¶Ë¿Ú11211 ×î´óÄÚ´æÊ¹ÓÃÁ¿Îª64M¡£µ÷ÊÔÐÅÏ¢µÄÄÚÈݴ󲿷ÖÊǹØÓÚ´æ´¢µÄÐÅÏ¢£¬
Ï´ÎÁ¬ÔØÊ±¾ßÌå˵Ã÷¡£
×÷Ϊdaemonºǫ́Æô¶¯Ê±£¬Ö»Ðè
slab class 38: chunk size 391224 perslab 2 slab class 39: chunk size 489032 perslab 2 <23 server listening <24 send buffer was 110592, now 268435456 <24 server listening (udp) <24 server listening (udp) <24 server listening (udp) <24 server listening (udp) |
ÕâÀïʹÓõÄmemcachedÆô¶¯Ñ¡ÏîµÄÄÚÈÝÈçÏ¡£

ÉÏÃæËĸöÊdz£ÓÃµÄÆô¶¯Ñ¡ÏÆäËû»¹Óкܶ࣬ͨ¹ý
$ /usr/local/bin/memcached -h |
ÃüÁî¿ÉÒÔÏÔʾ¡£Ðí¶àÑ¡Ïî¿ÉÒԸıämemcachedµÄ¸÷ÖÖÐÐΪ£¬ ÍÆ¼ö¶ÁÒ»¶Á¡£
Óÿͻ§¶ËÁ¬½Ó
Ðí¶àÓïÑÔ¶¼ÊµÏÖÁËÁ¬½ÓmemcachedµÄ¿Í»§¶Ë£¬ÆäÖÐÒÔPerl¡¢PHPΪÖ÷¡£ ½ö½ömemcachedÍøÕ¾ÉÏÁгöµÄÓïÑÔ¾ÍÓÐ
Perl
PHP
Python
Ruby
C#
C/C++
Lua
µÈµÈ¡£
memcached¿Í»§¶ËAPI£ºhttp://www.danga.com/memcached/apis.bml |
ÕâÀï½éÉÜͨ¹ýmixiÕýÔÚʹÓõÄPerl¿âÁ´½ÓmemcachedµÄ·½·¨¡£
ʹÓÃCache::Memcached
PerlµÄmemcached¿Í»§¶ËÓÐ
1.Cache::Memcached
2.Cache::Memcached::Fast
3.Cache::Memcached::libmemcached
µÈ¼¸¸öCPANÄ£¿é¡£ÕâÀï½éÉܵÄCache::MemcachedÊÇmemcachedµÄ×÷ÕßBrad
FitzpatricµÄ×÷Æ·£¬ Ó¦¸ÃËãÊÇmemcachedµÄ¿Í»§¶ËÖÐÓ¦ÓÃ×îΪ¹ã·ºµÄÄ£¿éÁË¡£
Cache::Memcached - search.cpan.org: http://search.cpan.org/dist/Cache-Memcached/ |
ʹÓÃCache::MemcachedÁ¬½Ómemcached
ÏÂÃæµÄÔ´´úÂëΪͨ¹ýCache::MemcachedÁ¬½Ó¸Õ²ÅÆô¶¯µÄmemcachedµÄÀý×Ó¡£
#!/usr/bin/perl
use strict;
use warnings;
use Cache::Memcached;
my $key = "foo";
my $value = "bar";
my $expires = 3600; # 1 hour
my $memcached = Cache::Memcached->new({
servers => ["127.0.0.1:11211"],
compress_threshold => 10_000
});
$memcached->add($key, $value, $expires);
my $ret = $memcached->get($key);
print "$ret\n"; |
ÔÚÕâÀΪCache::MemcachedÖ¸¶¨ÁËmemcached·þÎñÆ÷µÄIPµØÖ·ºÍÒ»¸öÑ¡ÏÒÔÉú³ÉʵÀý¡£
Cache::Memcached³£ÓõÄÑ¡ÏîÈçÏÂËùʾ¡£

servers ÓÃÊý×éÖ¸¶¨memcached·þÎñÆ÷ºÍ¶Ë¿Ú
compress_threshold Êý¾ÝѹËõʱʹÓõÄÖµ
namespace Ö¸¶¨Ìí¼Óµ½¼üµÄǰ׺
ÁíÍ⣬Cache::Memcachedͨ¹ýStorableÄ£¿é¿ÉÒÔ½«PerlµÄ¸´ÔÓÊý¾ÝÐòÁл¯Ö®ºóÔÙ±£´æ£¬
Òò´ËÉ¢ÁС¢Êý×é¡¢¶ÔÏóµÈ¶¼¿ÉÒÔÖ±½Ó±£´æµ½memcachedÖС£
±£´æÊý¾Ý
Ïòmemcached±£´æÊý¾ÝµÄ·½·¨ÓÐ
1.add
2.replace
3.set
ËüÃǵÄʹÓ÷½·¨¶¼Ïàͬ£º
my $add = $memcached->add( '¼ü', 'Öµ', 'ÆÚÏÞ' ); my $replace = $memcached->replace( '¼ü', 'Öµ', 'ÆÚÏÞ' ); my $set = $memcached->set( '¼ü', 'Öµ', 'ÆÚÏÞ' ); |
Ïòmemcached±£´æÊý¾Ýʱ¿ÉÒÔÖ¸¶¨ÆÚÏÞ(Ãë)¡£²»Ö¸¶¨ÆÚÏÞʱ£¬memcached°´ÕÕLRUËã·¨±£´æÊý¾Ý¡£
ÕâÈý¸ö·½·¨µÄÇø±ðÈçÏ£º

»ñÈ¡Êý¾Ý
»ñÈ¡Êý¾Ý¿ÉÒÔʹÓÃgetºÍget_multi·½·¨¡£
Ò»´ÎÈ¡µÃ¶àÌõÊý¾ÝʱʹÓÃget_multi¡£get_multi¿ÉÒÔ·Çͬ²½µØÍ¬Ê±È¡µÃ¶à¸ö¼üÖµ£¬
ÆäËÙ¶ÈÒª±ÈÑ»·µ÷ÓÃget¿ìÊýÊ®±¶¡£
my $val = $memcached->get('¼ü'); my $val = $memcached->get_multi('¼ü1', '¼ü2', '¼ü3', '¼ü4', '¼ü5'); |
ɾ³ýÊý¾Ý
ɾ³ýÊý¾ÝʹÓÃdelete·½·¨£¬²»¹ýËüÓиö¶ÀÌØµÄ¹¦ÄÜ¡£
$memcached->delete('¼ü', '×èÈûʱ¼ä(Ãë)'); |
ɾ³ýµÚÒ»¸ö²ÎÊýÖ¸¶¨µÄ¼üµÄÊý¾Ý¡£µÚ¶þ¸ö²ÎÊýÖ¸¶¨Ò»¸öʱ¼äÖµ£¬¿ÉÒÔ½ûֹʹÓÃͬÑùµÄ¼ü±£´æÐÂÊý¾Ý¡£
´Ë¹¦ÄÜ¿ÉÒÔÓÃÓÚ·ÀÖ¹»º´æÊý¾ÝµÄ²»ÍêÕû¡£µ«ÊÇҪעÒ⣬setº¯ÊýºöÊÓ¸Ã×èÈû£¬ÕÕ³£±£´æÊý¾Ý
ÔöÒ»ºÍ¼õÒ»²Ù×÷
¿ÉÒÔ½«memcachedÉÏÌØ¶¨µÄ¼üÖµ×÷Ϊ¼ÆÊýÆ÷ʹÓá£
my $ret = $memcached->incr('¼ü'); $memcached->add('¼ü', 0) unless defined $ret; |
ÔöÒ»ºÍ¼õÒ»ÊÇÔ×Ó²Ù×÷£¬µ«Î´ÉèÖóõʼֵʱ£¬²»»á×Ô¶¯¸³³É0¡£Òò´Ë£¬ Ó¦µ±½øÐдíÎó¼ì²é£¬±ØÒªÊ±¼ÓÈë³õʼ»¯²Ù×÷¡£¶øÇÒ£¬·þÎñÆ÷¶ËÒ²²»»á¶Ô
³¬¹ý2<sup>32</sup>ʱµÄÐÐΪ½øÐмì²é¡£
×ܽá
Õâ´Î¼òµ¥½éÉÜÁËmemcached£¬ÒÔ¼°ËüµÄ°²×°·½·¨¡¢Perl¿Í»§¶ËCache::MemcachedµÄÓ÷¨¡£
Ö»ÒªÖªµÀ£¬memcachedµÄʹÓ÷½·¨Ê®·Ö¼òµ¥¾Í×ã¹»ÁË¡£
Ï´ÎÓÉǰÛàÀ´ËµÃ÷memcachedµÄÄÚ²¿½á¹¹¡£Á˽âmemcachedµÄÄÚ²¿¹¹Ô죬
¾ÍÄÜÖªµÀÈçºÎʹÓÃmemcached²ÅÄÜʹWebÓ¦ÓõÄËٶȸüÉÏÒ»²ãÂ¥¡£ »¶Ó¼ÌÐøÔĶÁÏÂÒ»Õ¡£
|