日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

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

系統(tǒng) 2244 0

memcached是什么?

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

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

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

圖1 一般情況下memcached的用途

memcached的特征

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

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

協(xié)議簡單

memcached的服務(wù)器客戶端通信并不使用復(fù)雜的XML等格式,而使用簡單的基于文本行的協(xié)議。因此,通過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是個程序庫,它將Linux的epoll、BSD類操作系統(tǒng)的kqueue等事件處理功能封裝成統(tǒng)一的接口。即使對服務(wù)器的連接數(shù)增加,也能發(fā)揮O(1)的性能。memcached使用這個libevent庫,因此能在Linux、BSD、Solaris等操作系統(tǒng)上發(fā)揮其高性能。關(guān)于事件處理這里就不再詳細(xì)介紹,可以參考Dan Kegel的The C10K Problem。

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

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

memcached不互相通信的分布式

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

圖2 memcached的分布式

接下來簡單介紹一下memcached的使用方法。

安裝memcached

memcached的安裝比較簡單,這里稍加說明。

memcached支持許多平臺。

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

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

memcached的安裝

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

    $ sudo yum install libevent libevent-devel
  

memcached的源代碼可以從memcached網(wǎng)站上下載。本文執(zhí)筆時的最新版本為1.2.5。Fedora 8雖然也包含了memcached的rpm,但版本比較老。因為源代碼安裝并不困難,這里就不使用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的啟動

從終端輸入以下命令,啟動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)試信息。這樣就在前臺啟動了memcached,監(jiān)聽TCP端口11211最大內(nèi)存使用量為64M。調(diào)試信息的內(nèi)容大部分是關(guān)于存儲的信息,下次連載時具體說明。

作為daemon后臺啟動時,只需

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

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

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

上面四個是常用的啟動選項,其他還有很多,通過

    $ /usr/local/bin/memcached -h
  

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

用客戶端連接

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

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

等等。

這里介紹通過mixi正在使用的Perl庫鏈接memcached的方法。

使用Cache::Memcached

Perl的memcached客戶端有

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

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

使用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服務(wù)器的IP地址和一個選項,以生成實例。Cache::Memcached常用的選項如下所示。

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

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

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

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

  • add
  • replace
  • set

它們的使用方法都相同:

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

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

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

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

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

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

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

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

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

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

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

增一和減一操作

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

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

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

總結(jié)

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

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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 扎囊县| 三台县| 安泽县| 腾冲县| 策勒县| 海伦市| 东兴市| 米泉市| 高平市| 苗栗县| 阿瓦提县| 万山特区| 武胜县| 东阳市| 潞西市| 延津县| 财经| 武隆县| 泗洪县| 纳雍县| 扎鲁特旗| 龙陵县| 申扎县| 石泉县| 吉林省| 龙岩市| 施秉县| 汨罗市| 花莲市| 交口县| 郎溪县| 察隅县| 班玛县| 伊宁县| 阳新县| 唐河县| 南平市| 平乡县| 班戈县| 常山县| 罗平县|