<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Kevin.Zhong

    彪悍的人生不需要解釋,彪悍的代碼不需要測(cè)試。

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      17 隨筆 :: 12 文章 :: 14 評(píng)論 :: 0 Trackbacks

    memcached完全剖析–1. memcached的基礎(chǔ)

    作者:charlee  來(lái)源:idv2.com  時(shí)間:2008-09-28  閱讀:191 次  原文鏈接   [收藏]  

    翻譯一篇技術(shù)評(píng)論社的文章,是講memcached的連載。fcicq同學(xué)說(shuō)這個(gè)東西很有用,希望大家喜歡。

    發(fā)表日:2008/7/2
    作者:長(zhǎng)野雅廣(Masahiro Nagano)
    原文鏈接:http://gihyo.jp/dev/feature/01/memcached/0001

    我是mixi株式會(huì)社開發(fā)部系統(tǒng)運(yùn)營(yíng)組的長(zhǎng)野。 日常負(fù)責(zé)程序的運(yùn)營(yíng)。從今天開始,將分幾次針對(duì)最近在Web應(yīng)用的可擴(kuò)展性領(lǐng)域 的熱門話題memcached,與我公司開發(fā)部研究開發(fā)組的前坂一起, 說(shuō)明其內(nèi)部結(jié)構(gòu)和使用。

    memcached是什么?

    memcached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 為首開發(fā)的一款軟件。現(xiàn)在已成為 mixihatenaFacebookVox、LiveJournal等眾多服務(wù)中 提高Web應(yīng)用擴(kuò)展性的重要因素。

    許多Web應(yīng)用都將數(shù)據(jù)保存到RDBMS中,應(yīng)用服務(wù)器從中讀取數(shù)據(jù)并在瀏覽器中顯示。 但隨著數(shù)據(jù)量的增大、訪問(wèn)的集中,就會(huì)出現(xiàn)RDBMS的負(fù)擔(dān)加重、數(shù)據(jù)庫(kù)響應(yīng)惡化、 網(wǎng)站顯示延遲等重大影響。

    這時(shí)就該memcached大顯身手了。memcached是高性能的分布式內(nèi)存緩存服務(wù)器。 一般的使用目的是,通過(guò)緩存數(shù)據(jù)庫(kù)查詢結(jié)果,減少數(shù)據(jù)庫(kù)訪問(wèn)次數(shù),以提高動(dòng)態(tài)Web應(yīng)用的速度、 提高可擴(kuò)展性。


    圖1 一般情況下memcached的用途

    memcached的特征

    memcached作為高速運(yùn)行的分布式緩存服務(wù)器,具有以下的特點(diǎn)。

    • 協(xié)議簡(jiǎn)單
    • 基于libevent的事件處理
    • 內(nèi)置內(nèi)存存儲(chǔ)方式
    • memcached不互相通信的分布式

    協(xié)議簡(jiǎn)單

    memcached的服務(wù)器客戶端通信并不使用復(fù)雜的XML等格式, 而使用簡(jiǎn)單的基于文本行的協(xié)議。因此,通過(guò)telnet 也能在memcached上保存數(shù)據(jù)、取得數(shù)據(jù)。下面是例子。

    $ 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 (數(shù)據(jù))

    STORED (結(jié)果)

    get foo (取得命令)

    VALUE foo 0 3 (數(shù)據(jù))

    bar (數(shù)據(jù))

    協(xié)議文檔位于memcached的源代碼內(nèi),也可以參考以下的URL。

    基于libevent的事件處理

    libevent是個(gè)程序庫(kù),它將Linux的epoll、BSD類操作系統(tǒng)的kqueue等事件處理功能 封裝成統(tǒng)一的接口。即使對(duì)服務(wù)器的連接數(shù)增加,也能發(fā)揮O(1)的性能。 memcached使用這個(gè)libevent庫(kù),因此能在Linux、BSD、Solaris等操作系統(tǒng)上發(fā)揮其高性能。 關(guān)于事件處理這里就不再詳細(xì)介紹,可以參考Dan Kegel的The C10K Problem。

    內(nèi)置內(nèi)存存儲(chǔ)方式

    為了提高性能,memcached中保存的數(shù)據(jù)都存儲(chǔ)在memcached內(nèi)置的內(nèi)存存儲(chǔ)空間中。 由于數(shù)據(jù)僅存在于內(nèi)存中,因此重啟memcached、重啟操作系統(tǒng)會(huì)導(dǎo)致全部數(shù)據(jù)消失。 另外,內(nèi)容容量達(dá)到指定值之后,就基于LRU(Least Recently Used)算法自動(dòng)刪除不使用的緩存。 memcached本身是為緩存而設(shè)計(jì)的服務(wù)器,因此并沒有過(guò)多考慮數(shù)據(jù)的永久性問(wèn)題。 關(guān)于內(nèi)存存儲(chǔ)的詳細(xì)信息,本連載的第二講以后前坂會(huì)進(jìn)行介紹,請(qǐng)屆時(shí)參考。

    memcached不互相通信的分布式

    memcached盡管是“分布式”緩存服務(wù)器,但服務(wù)器端并沒有分布式功能。 各個(gè)memcached不會(huì)互相通信以共享信息。那么,怎樣進(jìn)行分布式呢? 這完全取決于客戶端的實(shí)現(xiàn)。本連載也將介紹memcached的分布式。


    圖2 memcached的分布式

    接下來(lái)簡(jiǎn)單介紹一下memcached的使用方法。

    安裝memcached

    memcached的安裝比較簡(jiǎn)單,這里稍加說(shuō)明。

    memcached支持許多平臺(tái)。

    • Linux
    • FreeBSD
    • Solaris (memcached 1.2.5以上版本)
    • Mac OS X

    另外也能安裝在Windows上。這里使用Fedora Core 8進(jìn)行說(shuō)明。

    memcached的安裝

    運(yùn)行memcached需要本文開頭介紹的libevent庫(kù)。Fedora 8中有現(xiàn)成的rpm包, 通過(guò)yum命令安裝即可。

    $ sudo yum install libevent libevent-devel

    memcached的源代碼可以從memcached網(wǎng)站上下載。本文執(zhí)筆時(shí)的最新版本為1.2.5。 Fedora 8雖然也包含了memcached的rpm,但版本比較老。因?yàn)樵创a安裝并不困難, 這里就不使用rpm了。

    memcached安裝與一般應(yīng)用程序相同,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

    默認(rèn)情況下memcached安裝到/usr/local/bin下。

    memcached的啟動(dòng)

    從終端輸入以下命令,啟動(dòng)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)

    這里顯示了調(diào)試信息。這樣就在前臺(tái)啟動(dòng)了memcached,監(jiān)聽TCP端口11211 最大內(nèi)存使用量為64M。調(diào)試信息的內(nèi)容大部分是關(guān)于存儲(chǔ)的信息, 下次連載時(shí)具體說(shuō)明。

    作為daemon后臺(tái)啟動(dòng)時(shí),只需

    $ /usr/local/bin/memcached -p 11211 -m 64m -d

    這里使用的memcached啟動(dòng)選項(xiàng)的內(nèi)容如下。

    選項(xiàng) 說(shuō)明
    -p 使用的TCP端口。默認(rèn)為11211
    -m 最大內(nèi)存大小。默認(rèn)為64M
    -vv 用very vrebose模式啟動(dòng),調(diào)試信息和錯(cuò)誤輸出到控制臺(tái)
    -d 作為daemon在后臺(tái)啟動(dòng)

    上面四個(gè)是常用的啟動(dòng)選項(xiàng),其他還有很多,通過(guò)

    $ /usr/local/bin/memcached -h

    命令可以顯示。許多選項(xiàng)可以改變memcached的各種行為, 推薦讀一讀。

    用客戶端連接

    許多語(yǔ)言都實(shí)現(xiàn)了連接memcached的客戶端,其中以Perl、PHP為主。 僅僅memcached網(wǎng)站上列出的語(yǔ)言就有

    • Perl
    • PHP
    • Python
    • Ruby
    • C#
    • C/C++
    • Lua

    等等。

    這里介紹通過(guò)mixi正在使用的Perl庫(kù)鏈接memcached的方法。

    使用Cache::Memcached

    Perl的memcached客戶端有

    • Cache::Memcached
    • Cache::Memcached::Fast
    • Cache::Memcached::libmemcached

    等幾個(gè)CPAN模塊。這里介紹的Cache::Memcached是memcached的作者Brad Fitzpatric的作品, 應(yīng)該算是memcached的客戶端中應(yīng)用最為廣泛的模塊了。

    使用Cache::Memcached連接memcached

    下面的源代碼為通過(guò)Cache::Memcached連接剛才啟動(dòng)的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服務(wù)器的IP地址和一個(gè)選項(xiàng),以生成實(shí)例。 Cache::Memcached常用的選項(xiàng)如下所示。

    選項(xiàng) 說(shuō)明
    servers 用數(shù)組指定memcached服務(wù)器和端口
    compress_threshold 數(shù)據(jù)壓縮時(shí)使用的值
    namespace 指定添加到鍵的前綴

    另外,Cache::Memcached通過(guò)Storable模塊可以將Perl的復(fù)雜數(shù)據(jù)序列化之后再保存, 因此散列、數(shù)組、對(duì)象等都可以直接保存到memcached中。

    保存數(shù)據(jù)

    向memcached保存數(shù)據(jù)的方法有

    • add
    • replace
    • set

    它們的使用方法都相同:

    my $add = $memcached->add( '鍵', '值', '期限' );

    my $replace = $memcached->replace( '鍵', '值', '期限' );

    my $set = $memcached->set( '鍵', '值', '期限' );

    向memcached保存數(shù)據(jù)時(shí)可以指定期限(秒)。不指定期限時(shí),memcached按照LRU算法保存數(shù)據(jù)。 這三個(gè)方法的區(qū)別如下:

    選項(xiàng) 說(shuō)明
    add 僅當(dāng)存儲(chǔ)空間中不存在鍵相同的數(shù)據(jù)時(shí)才保存
    replace 僅當(dāng)存儲(chǔ)空間中存在鍵相同的數(shù)據(jù)時(shí)才保存
    set 與add和replace不同,無(wú)論何時(shí)都保存

    獲取數(shù)據(jù)

    獲取數(shù)據(jù)可以使用get和get_multi方法。

    my $val = $memcached->get('鍵');

    my $val = $memcached->get_multi('鍵1', '鍵2', '鍵3', '鍵4', '鍵5');

    一次取得多條數(shù)據(jù)時(shí)使用get_multi。get_multi可以非同步地同時(shí)取得多個(gè)鍵值, 其速度要比循環(huán)調(diào)用get快數(shù)十倍。

    刪除數(shù)據(jù)

    刪除數(shù)據(jù)使用delete方法,不過(guò)它有個(gè)獨(dú)特的功能。

    $memcached->delete('鍵', '阻塞時(shí)間(秒)');

    刪除第一個(gè)參數(shù)指定的鍵的數(shù)據(jù)。第二個(gè)參數(shù)指定一個(gè)時(shí)間值,可以禁止使用同樣的鍵保存新數(shù)據(jù)。 此功能可以用于防止緩存數(shù)據(jù)的不完整。但是要注意,set函數(shù)忽視該阻塞,照常保存數(shù)據(jù)

    增一和減一操作

    可以將memcached上特定的鍵值作為計(jì)數(shù)器使用。

    my $ret = $memcached->incr('鍵');

    $memcached->add('鍵', 0) unless defined $ret;

    增一和減一是原子操作,但未設(shè)置初始值時(shí),不會(huì)自動(dòng)賦成0。因此, 應(yīng)當(dāng)進(jìn)行錯(cuò)誤檢查,必要時(shí)加入初始化操作。而且,服務(wù)器端也不會(huì)對(duì) 超過(guò)2<sup>32</sup>時(shí)的行為進(jìn)行檢查。

    總結(jié)

    這次簡(jiǎn)單介紹了memcached,以及它的安裝方法、Perl客戶端Cache::Memcached的用法。 只要知道,memcached的使用方法十分簡(jiǎn)單就足夠了。

    下次由前坂來(lái)說(shuō)明memcached的內(nèi)部結(jié)構(gòu)。了解memcached的內(nèi)部構(gòu)造, 就能知道如何使用memcached才能使Web應(yīng)用的速度更上一層樓。 歡迎繼續(xù)閱讀下一章。

    posted on 2008-10-15 11:28 Kevin.Zhong 閱讀(224) 評(píng)論(0)  編輯  收藏 所屬分類: memcache
    主站蜘蛛池模板: 亚洲视频在线观看网址| 国内成人精品亚洲日本语音| 国产电影午夜成年免费视频 | 亚洲精品国产精品乱码不卡| 国产区在线免费观看| 亚洲天天在线日亚洲洲精| 免费黄色毛片视频| 男女一边摸一边做爽的免费视频| 久久精品国产亚洲AV麻豆网站| 成人免费视频观看无遮挡| 一个人看的www在线免费视频 | 国产成人人综合亚洲欧美丁香花| 永久亚洲成a人片777777| 皇色在线视频免费网站| 日产久久强奸免费的看| 亚洲毛片无码专区亚洲乱| 免费国产在线观看| 免费看男女下面日出水来| 无忧传媒视频免费观看入口| 亚洲视频一区二区在线观看| 婷婷亚洲天堂影院| 日本XXX黄区免费看| 人人鲁免费播放视频人人香蕉| 亚洲性一级理论片在线观看| 久久亚洲高清综合| 免费无码一区二区三区蜜桃大 | 亚洲国产精品成人一区| 99精品一区二区免费视频| 瑟瑟网站免费网站入口| 亚洲国产精品成人综合色在线婷婷| 亚洲AV成人精品日韩一区18p| 亚色九九九全国免费视频| 西西人体免费视频| 瑟瑟网站免费网站入口| 亚洲乱人伦中文字幕无码| 亚洲精品中文字幕无乱码| 亚洲精品美女久久久久99| 婷婷亚洲天堂影院| 国产美女精品久久久久久久免费| 真人做人试看60分钟免费视频| 18禁在线无遮挡免费观看网站|