Memcached在大型網(wǎng)站中應(yīng)用.doc_第1頁(yè)
Memcached在大型網(wǎng)站中應(yīng)用.doc_第2頁(yè)
Memcached在大型網(wǎng)站中應(yīng)用.doc_第3頁(yè)
Memcached在大型網(wǎng)站中應(yīng)用.doc_第4頁(yè)
Memcached在大型網(wǎng)站中應(yīng)用.doc_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

memcached是一個(gè)高性能的分布式的內(nèi)存對(duì)象緩存系統(tǒng),通過(guò)在內(nèi)存里維護(hù)一個(gè)統(tǒng)一的巨大的hash表,它能夠用來(lái)存儲(chǔ)各種格式的數(shù)據(jù),包括圖像、視頻、文件以及數(shù)據(jù)庫(kù)檢索的結(jié)果等。最初為了加速 LiveJournal 訪問(wèn)速度而開(kāi)發(fā)的,后來(lái)被很多大型的網(wǎng)站采用。起初作者編寫它可能是為了提高動(dòng)態(tài)網(wǎng)頁(yè)應(yīng)用,為了減輕數(shù)據(jù)庫(kù)檢索的壓力,來(lái)做的這個(gè)緩存系統(tǒng)。它的緩存是一種分布式的,也就是可以允許不同主機(jī)上的多個(gè)用戶同時(shí)訪問(wèn)這個(gè)緩存系統(tǒng), 這種方法不僅解決了共享內(nèi)存只能是單機(jī)的弊端, 同時(shí)也解決了數(shù)據(jù)庫(kù)檢索的壓力,最大的優(yōu)點(diǎn)是提高了訪問(wèn)獲取數(shù)據(jù)的速度!基于memcached作者對(duì)分布式cache的理解和解決方案。memcached完全可以用到其他地方 比如分布式數(shù)據(jù)庫(kù), 分布式計(jì)算等領(lǐng)域。 1、memcached 協(xié)議理解memcache是為了加快/訪問(wèn)速度而誕生的一個(gè)項(xiàng)目。它的官方主頁(yè)是:/memcached/目前在網(wǎng)站開(kāi)發(fā)中應(yīng)用較少,主要的應(yīng)用有:/memcached/users.bml在國(guó)內(nèi)的網(wǎng)站開(kāi)發(fā)中,還很少?zèng)]見(jiàn)到有應(yīng)用的,中文資料十分匱乏。工作機(jī)制:通過(guò)在內(nèi)存中開(kāi)辟一塊區(qū)域來(lái)維持一個(gè)大的hash表來(lái)加快頁(yè)面訪問(wèn)速度,和數(shù)據(jù)庫(kù)是獨(dú)立的。但是目前主要用來(lái)緩存數(shù)據(jù)庫(kù)的數(shù)據(jù)。允許多個(gè)server通過(guò)網(wǎng)絡(luò)形成一個(gè)大的hash,用戶不必關(guān)心數(shù)據(jù)存放在哪,只調(diào)用相關(guān)接口就可。存放在內(nèi)存的數(shù)據(jù)通過(guò)LRU算法進(jìn)行淘汰出內(nèi)存。同時(shí)可以通過(guò)刪除和設(shè)置失效時(shí)間來(lái)淘汰存放在內(nèi)存的數(shù)據(jù)。2、memcached 使用入門2.1 memcached的安裝 ?memcached服務(wù)的安裝 先檢查linux內(nèi)核版本,建議將memcached 安裝在2.6以上。 因?yàn)閙emcached 需要用到libevent和 epoll 。memcached安裝前首先確定你的服務(wù)器上面安裝了libevent庫(kù),libevent下載地址( /provos/libevent/)。下載memcached的源碼( /memcached/download.bml)。Memcached最初是用perl寫的,現(xiàn)在的版本是用c寫的。下載后拷貝到一個(gè)目錄,安裝需要root用戶來(lái)執(zhí)行tar -zxvf memcached-1.1.12.tar.gzcd memcached-1.1.12./configure這里必須先要configure, 它會(huì)檢測(cè)你的系統(tǒng)情況,然后生成一個(gè)config.h文件和其它的幾個(gè)文件,另外和其它的configure一樣,你可以配置它的安裝路徑等等。默認(rèn)應(yīng)用程序安裝在/usr/local/bin目錄下。make /編譯make install /安裝memcached客戶端的安裝根據(jù)memcached協(xié)議,用戶可以自己寫出符合自己要求的客戶端程序。目前/memcached/download.bml提供perl,c,java,python,php等客戶端程序供下載和參考。下面我就以perl客戶端程序?yàn)槔f(shuō)明客戶端的安裝:下載后拷貝到一個(gè)目錄,安裝需要root用戶來(lái)執(zhí)行tar -zxvf Cache-Memcached-1.14.tar.gzcd Cache-Memcached-1.14perl makefile.plmakemake installmake test這樣就安裝好了memcahced, 啟動(dòng)memcached就可使用分布式緩存系統(tǒng)了!2.2 快速入門 memcached服務(wù)的啟動(dòng) memcached的啟動(dòng)非常簡(jiǎn)單,它沒(méi)有配置文件,只要配置好幾個(gè)參數(shù)就可以使用了。下面我以一個(gè)實(shí)際應(yīng)用的例子,具體說(shuō)明一下:memcached d m 500 -l 51 -p 11211 -vv /var/www/kelly/test/logs/memcached_$.log啟動(dòng)的這個(gè)memcached為一個(gè)后臺(tái)守護(hù)進(jìn)程模式(-d), 然后緩存的空間為500M(-m), 監(jiān)聽(tīng)(-l)服務(wù)器5的11211號(hào)端口(-p).,將日志寫道/var/www/kelly/test/logs/memcached_$.log(-vv)。其實(shí)memcached的參數(shù)也非常的有限,就下面這幾個(gè):? -p port number to listen on ? -l interface to listen on, default is INDRR_ANY ? -d run as a daemon ? -r maximize core file limit ? -u assume identity of (only when run as root) ? -m max memory to use for items in megabytes, default is 64 MB ? -M return error on memory exhausted (rather than removing items) ? -c max simultaneous connections, default is 1024 ? -k lock down all paged memory ? -v verbose (print errors/warnings while in event loop) ? -vv very verbose (also print client commands/reponses) ? -h print this help and exit ? -i print memcached and libevent license 我們也可以將這個(gè)啟動(dòng)腳本寫道/etc/rc.d或者/erc/rc.local,這樣可以在服務(wù)器啟動(dòng)時(shí)候執(zhí)行。 memcached客戶端的連接下面我就以perl客戶端程序?yàn)槔f(shuō)明客戶端的連接:啟動(dòng)兩個(gè)memcached servermemcached d m 500 -l 51 -p 11211 -vv /var/www/kelly/test/logs/memcached_$.logmemcached d m 500 -l 51 -p 11212 -vv /var/www/kelly/test/logs/memcached_$.logperl客戶端程序#!/usr/bin/perluse Cache:Memcached;my $memd = new Cache:Memcached servers = 5:11211 , 5:11212, ;my $val = $memd-get( my_key );if ( $val ) print Value is $valn;# Set a value$memd-set(my_key, 123);$memd-disconnect_all();?運(yùn)行測(cè)試$ perl test-memcache.pl$ perl test-memcache.plValue is 123可以看到,第一次沒(méi)有取得my_key,第二次從memcached中得到my_key的值。同時(shí)通過(guò)查看日志,可以發(fā)現(xiàn)的確存儲(chǔ)在兩個(gè)memcache server中。這個(gè)簡(jiǎn)單的例子,解釋了如何在memcached中存取數(shù)據(jù),以及memcache是真正的分布式緩存系統(tǒng)。當(dāng)然,這還只是很簡(jiǎn)單的例子,體現(xiàn)不出memcache的優(yōu)勢(shì),下面將通過(guò)一個(gè)很具體的例子,給出詳細(xì)的應(yīng)用。3、memcached在Zorpia的應(yīng)用 是一個(gè)網(wǎng)頁(yè)相冊(cè),博客,交友,論壇的大型網(wǎng)站公司?,F(xiàn)在已有超過(guò)140萬(wàn)活躍使用者遍布美國(guó),香港,東南亞,歐洲,澳洲,亞洲等其它地區(qū)。每天的訪問(wèn)量都在增長(zhǎng),已成為全世界排名第五的社會(huì)生活關(guān)系網(wǎng)。Memcached也采用了memcached來(lái)提高網(wǎng)站的訪問(wèn)速度,并且取得了很好的效果,我在負(fù)責(zé)zorpia的memcached項(xiàng)目時(shí)候積累了一些經(jīng)驗(yàn),主要的做法如下:1)通過(guò)對(duì)memcache的perl客戶端進(jìn)行包裝,定制自己的客戶端。2)通過(guò)制定符合zorpia規(guī)范的hash key命名規(guī)范? ? memcache中需要存儲(chǔ)的內(nèi)容的key均由string組成。這個(gè)string統(tǒng)一由一個(gè)memcache.pm的subroutine來(lái)實(shí)現(xiàn)。(假設(shè)這個(gè)subroutine是 get_key() )? ? memcache中存放兩種形式的數(shù)據(jù) (1) result of SQL query : (2) 普通變量(variable) 這兩種數(shù)據(jù)的key的組合方式是不相同的,由get_key進(jìn)行判斷和完成? ? 關(guān)于get_key 和 naming rule get_key subroutine完成所有memcache key的命名,naming rule也是在它里邊體現(xiàn): (1)輸入?yún)?shù) hash結(jié)構(gòu),里邊定義了當(dāng)前需要存放的數(shù)據(jù)的信息 結(jié)構(gòu) (2)返回值 string,返回?cái)?shù)據(jù)的key_name?必須確定 get_key 的傳入hash的結(jié)構(gòu), hash中主要有兩個(gè)元素 type - 定義當(dāng)前數(shù)據(jù)結(jié)構(gòu)的類型 ,有 var , sql兩種值 object - 存放當(dāng)前數(shù)據(jù)結(jié)構(gòu)的詳細(xì)信息, 當(dāng) type eq var時(shí),object表示變量的名字,該名字由程序員指定 當(dāng) type eq sql時(shí),object包含所存放sql的主要基本信息,hash結(jié)構(gòu),也由程序員按照規(guī)則制定 # 當(dāng)variable 數(shù)據(jù)類型,比較簡(jiǎn)單 $var_hash = type = var, # var表示當(dāng)前類型是 variable object = language, # language代表variable的名字 ;生成的key是Zorpia:var| language # sql 數(shù)據(jù) 比如select first_name from user where user_id =2那么hash為 $sql_hash = type = sql, object = table = table2=user, # sql 查詢的表 column = column1=first_name, # sql所要查詢的column condition = user_id =2, # sql條件 , ;生成的key是Zorpia:sql|user|first_name| user_id =2 get_key subroutine必須對(duì)傳入hash進(jìn)行判斷,對(duì)不同類型的數(shù)據(jù)按照不同的方式組合,形成key,返回給使用者。這個(gè)key,必須保證其唯一性:比如:所有字母小寫,一些數(shù)組在組合成key之前必須首先排序? ? get_key函數(shù)sub get_keymy $hash = shift;return undef unless $hash & ref $hash eq HASH;my $type = $hash-type;my $key_name;if ($type eq sql) my ($table_key,$column_key,$condition_key);$table_key=_get_key($hash-object-table);$column_key=_get_key($hash-object-column);$condition_key=_get_key($hash-object-condition);$key_name = join(|,$type,$table_key,$column_key,$condition_key);#Currently the length limit of a key is set at 250 charactersif (length($key_name)250)$key_name=substr(0,250,$key_name);elsif($type eq var)$key_name = join(|,$type,$hash-object);return $key_name;sub _get_keymy $hash=shift;return undef unless $hash & ref $hash eq HASH;my ($t,$ret,$i);foreach $i (sort keys %$hash) $i=s/s+|s+$/g; $hash-$i=s/s+|s+$/g; push($t,lc($i=$hash-$i);$ret=join(:,sort $a cmp $b $t);return $ret; 3)制定需要應(yīng)用memcached的規(guī)則?經(jīng)常訪問(wèn)的表user,user_details?合理設(shè)定變量在memcached的生存周期?將活躍用戶的信息預(yù)先導(dǎo)入到memcached?分別在多臺(tái)機(jī)器上啟動(dòng)多個(gè)memcached服務(wù)?編寫腳本監(jiān)控memcached服務(wù)是否活動(dòng)4)User表的具體應(yīng)用舉例? 在 select時(shí)候先查詢memcahce里有沒(méi)有,有的話,返回;否則從數(shù)據(jù)庫(kù)select,在memcache里設(shè)置,返回。my $sql_hash = type = sql, object = table = table1=user, column = column1=user_id, condition = email=$user_id, , ; my $key=Zorpia:MemCache:get_key($sql_hash); my $user_id_by_email=Zorpia:MemCache:get($key); if(!$user_id_by_email) my $sth; my $query =select user_id from user where email=?; $sth = $dbh-prepare($query); $sth-execute($user_id); my $user1 = $sth-fetchrow_hashref(); $user_id_by_email=$user1-user_id; Zorpia:MemCache:set($key,$user_id_by_email,1800); ?在 update,insert,delete時(shí)候先在數(shù)據(jù)庫(kù)update,insert,delete,在memcache里設(shè)置,返回。&Zorpia:DB:data_entry_no_return($dbh,user,COUNT(*),$account_information_insert_statement user_id=$current_user_id, user_id=$current_user_id);#add by kellymy $sql_hash = type = sql, object = table = table1=user, column = column1=user_id, condition = user_id=$current_user_id, , ; my $key=Zorpia:MemCache:get_key($sql_hash); my $query = SELECT *

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論