版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、memcache安裝安裝libevent庫Linux:centOs5.4cd /usr/local/srcwget /provos/libevent-1.3b.tar.gztar zxvf libevent-1.3b.tar.gzcd libevent-1.3b./configuremake & make install安裝成功安裝memcachecd /usr/local/srcwget /memcached/dist/memcached-1.2.5.tar.gztar zxvf memcached-1.2.5.tar.gzcd
2、memcached-1.2.5./configuremake & make install啟動cd usr/local/binbin # memcached h出錯memcached: error while loading shared libraries: libevent-1.3b.so.1: cannot open shared object file: No such file or directorygoogle解決方法: /archiver/?tid-86.html則運行 LD_DUBUG=libs 就可以知道m(xù)emcached啟動時庫的加載路
3、徑。具體如下:rootbogon usr/local/bin# LD_DEBUG=libs memcached v 5112: find library=libevent-1.3b.so.1 0; searching 5112: search cache=/etc/ld.so.cache 5112: search path=/lib/tls/i686/sse2:/lib/tls/i686:/lib/tls/sse2:/lib/tls:/lib/i686/sse2:/lib/i686:/lib/sse2:/lib:/usr/lib/tls/i686/sse2:/usr/lib/tls/i686:
4、/usr/lib/tls/sse2:/usr/lib/tls:/usr/lib/i686/sse2:/usr/lib/i686:/usr/lib/sse2:/usr/lib (system search path) 5112: trying file=/lib/tls/i686/sse2/libevent-1.3b.so.1 5112: trying file=/lib/tls/i686/libevent-1.3b.so.1 5112: trying file=/lib/tls/sse2/libevent-1.3b.so.1 5112: trying file=/lib/tls/libeven
5、t-1.3b.so.1 5112: trying file=/lib/i686/sse2/libevent-1.3b.so.1 5112: trying file=/lib/i686/libevent-1.3b.so.1 5112: trying file=/lib/sse2/libevent-1.3b.so.1 5112: trying file=/lib/libevent-1.3b.so.1 5112: trying file=/usr/lib/tls/i686/sse2/libevent-1.3b.so.1 5112: trying file=/usr/lib/tls/i686/libe
6、vent-1.3b.so.1 5112: trying file=/usr/lib/tls/sse2/libevent-1.3b.so.1 5112: trying file=/usr/lib/tls/libevent-1.3b.so.1 5112: trying file=/usr/lib/i686/sse2/libevent-1.3b.so.1 5112: trying file=/usr/lib/i686/libevent-1.3b.so.1 5112: trying file=/usr/lib/sse2/libevent-1.3b.so.1 5112: trying file=/usr
7、/lib/libevent-1.3b.so.1然后給libevent-1.3b.so.1建立一個鏈接:rootbogon # sudo ln -s /usr/local/lib/libevent-1.3b.so.1 /lib/libevent-1.3b.so.1檢查是否建立成功rootbogon # ls -al /lib|grep libeventlrwxrwxrwx 1 root root 33 Aug 25 19:52 libevent-1.3b.so.1 - /usr/local/lib/libevent-1.3b.so.1此時在bin # memcached hrootbogon b
8、in# memcached -hmemcached 1.2.5-p TCP port number to listen on (default: 11211)-U UDP port number to listen on (default: 0, off)-s unix socket path to listen on (disables network support)-a access mask for unix socket, in octal (default 0700)-l interface to listen on, default is INDRR_ANY-d run as a
9、 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. Note that there i
10、s a limit on how much memory you may lock. Trying to allocate more than that would fail, so be sure you set the limit correctly for the user you started the daemon with (not for -u user; under sh this is done with ulimit -S -l NUM_KB).-v verbose (print errors/warnings while in event loop)-vv very ve
11、rbose (also print client commands/reponses)-h print this help and exit-i print memcached and libevent license-b run a managed instanced (mnemonic: buckets)-P save PID in , only used with -d option-f chunk size growth factor, default 1.25-n minimum space allocated for key+value+flags, default 48現(xiàn)在mem
12、cache成功搞定默認情況下memcached安裝到/usr/local/bin下。啟動:rootbogon bin# memcached -d -m 128 -u root -p 11211檢查是否已經(jīng)啟動rootbogon bin# telnet 11211Trying .Connected to localhost.localdomain ().Escape character is .這里使用的memcached啟動選項的內(nèi)容如下。選項說明p 使用的TCP端口。默認為11211m 最大內(nèi)存大小。默認為64Mvv 用very vre
13、bose模式啟動,調(diào)試信息和錯誤輸出到控制臺d 作為daemon在后臺啟動查看memcached的內(nèi)部狀態(tài)rootbogon bin# cd /usr/local/binrootbogon bin# telnet 11211Trying .Connected to localhost.localdomain ().Escape character is .statsSTAT pid 6779STAT uptime 14217是memcached運行的秒數(shù)STAT time STAT version 1.2.5STAT pointer_si
14、ze 32STAT rusage_user 0.STAT rusage_system 0.STAT curr_items 0 表示現(xiàn)在在緩存中的鍵值對 個數(shù)STAT total_items 0 總數(shù)STAT bytes 0STAT curr_connections 3 當(dāng)前連接數(shù)STAT total_connections 4 總連接數(shù)STAT connection_structures 4STAT cmd_get 0 查詢緩存的次數(shù)STAT cmd_set 0設(shè)置key=value的次數(shù)STAT get_hits 0 緩存命中的次數(shù)STAT get_misses 0 get_misses的數(shù)
15、字加上get_hits應(yīng)該等于cmd_getSTAT evictions 0STAT bytes_read 56STAT bytes_written 482STAT limit_maxbytes STAT threads 1ENDQuit其中,uptime 是memcached運行的秒數(shù),cmd_get是查詢緩存的次數(shù)。這兩個數(shù)據(jù)相除一下就能得到平均每秒請求緩存的次數(shù)最近niupu的流量很低,所以平均也就一秒請求一次多,這么點大的壓力,用文件系統(tǒng)緩存一樣沒問題,根本不會體現(xiàn)出使用memcached的優(yōu)越。 下面的cmd_set 就是設(shè)置key=value的次數(shù)。整個memcached是個大ha
16、sh,用cmd_get沒有找到的內(nèi)容,就會調(diào)用一下cmd_set寫進緩存里。緊跟著是get_hits,就是緩存命中的次數(shù)。緩存命中率 =get_hits/cmd_get * 100%。 下面的get_misses的數(shù)字加上get_hits應(yīng)該等于cmd_get。而total_itemscurr_items表示現(xiàn)在在緩存中的鍵值對 個數(shù),在圖上total_items = cmd_set = get_misses,不過當(dāng)可用最大內(nèi)存用光時,memcached就會刪掉一些內(nèi)容,上面的等式就不成立了。Spring aop 管理memcached1, 給DAO的方法上加SpringAOP的Around通
17、知,決定數(shù)據(jù)從數(shù)據(jù)庫獲得還是從緩存獲得。 2,自定義兩個Annotation,Cache和Flush,分別加在DAO的查詢和修改的方法上。 3,Around通知函數(shù)內(nèi)用反射獲取上述的cache和Flush,代表是記錄緩存,還是刪除緩存。 4,記錄緩存時用“類名+方法名+參數(shù)的hashcode”作為Key,刪除緩存時,刪除所有的同類名開頭的key對應(yīng)的緩存。 5,Memcached不支持遍歷key,所以采用數(shù)據(jù)庫表記錄key,假設(shè):tbl_memcached(key,exp_date)。 6,定義一個時鐘,定期刪除tbl_memcached的過期記錄(刪除數(shù)據(jù)庫記錄前,刪除緩存)。 7,記錄緩存
18、時,同時存入一條記錄到tbl_memcached表。 8,刪除緩存是依據(jù)tbl_memcache表的key來進行,并且要刪除tbl_memcached表的相關(guān)記錄。使用memcached顯著提升站點性能Memcached 常被用來加速應(yīng)用程序的處理,在這里,我們將著重于介紹將它部署于應(yīng)用程序和環(huán)境中的最佳實踐。這包括應(yīng)該存儲或不應(yīng)存儲哪些、如何處理數(shù)據(jù)的靈活分布以 及如何調(diào)節(jié)用來更新 memcached 和所存儲數(shù)據(jù)的方法。我們還將介紹對高可用性的解決方案的支持,比如 IBM WebSphere eXtreme Scale。所有的應(yīng)用程序,特別是很多 web 應(yīng)用程序都需要優(yōu)化它們訪問客戶機和
19、將信息返回至客戶機的速度??墒牵ǔ?,返回的都是相同的信息。從數(shù)據(jù)源(數(shù)據(jù)庫或文件系統(tǒng))加載數(shù)據(jù)十分低效,若是每次想要訪問該信息時都運行相同的查詢,就尤顯低效。雖然很多 web 服務(wù)器都可被配置成使用緩存發(fā)回信息,但那與大多數(shù)應(yīng)用程序的動態(tài)特性無法相適。而這正是 memcached 的用武之地。它提供了一個通用的內(nèi)存存儲器,可保存任何東西,包括本地語言的對象,這就讓您可以存儲各種各樣的信息并可以從諸多的應(yīng)用程序和環(huán)境訪問這些 信息。1基礎(chǔ)知識 Memcached 是一個開源項目,旨在利用多個服務(wù)器內(nèi)的多余 RAM 來充當(dāng)一個可存放經(jīng)常被訪問信息的內(nèi)存緩存。這里的關(guān)鍵是使用了術(shù)語緩存:memca
20、ched 為加載自他處的信息提供的是內(nèi)存中的暫時存儲。 比如,考慮這樣一個典型的基于 web 的應(yīng)用程序。即便是一個動態(tài)網(wǎng)站可能也會有一些組件或信息常量是貫穿頁面整個生命周期的。在一個博客站點內(nèi),針對單個 blog post 的類別列表不大可能在頁面查看間經(jīng)常性地變更。每次都通過一個對數(shù)據(jù)庫的查詢加載此信息相對比較昂貴,特別是在數(shù)據(jù)沒有更改的情況下,就更是如此。從圖 1 可以看到一個博客站點內(nèi)可被緩存的頁面分區(qū)。將這種結(jié)構(gòu)放在 blog 站點的其他元素,poster 信息、注釋 設(shè)置 blog post 本身 進行推斷,可以看出為了顯示主頁的內(nèi)容很可能需要發(fā)生 10-20 次數(shù)據(jù)庫查詢和格式化
21、。 每天對數(shù)百甚至數(shù)千的的頁面查看重復(fù)此過程,那么您的服務(wù)器和應(yīng)用程序執(zhí)行的查詢要遠遠多于為了顯示頁面內(nèi)容所需執(zhí)行的查詢。通過使用 memcached,可以將加載自數(shù)據(jù)庫的格式化信息存儲為一種可直接用在 Web 頁面上的格式。并且由于信息是從 RAM 而不是通過數(shù)據(jù)庫和其他處理從磁盤加載的,所以對信息的訪問幾乎是瞬時的。再強調(diào)一下,memcached 是一個用來存儲常用信息的緩存,有了它,您便無需從緩慢的資源,比如磁盤或數(shù)據(jù)庫,加載并處理信息了。對 memcached 的接口是通過網(wǎng)絡(luò)連接提供的。這意味著您可以在多個客戶機間共享單個的 memcached 服務(wù)器(或多個服務(wù)器,如本文稍后所示的
22、)。這個網(wǎng)絡(luò)接口非常迅速,并且為了改善性能,服務(wù)器會故意不支持身份驗證或安全性通信。但這不應(yīng)限制部署選項。 memcached 服務(wù)器應(yīng)該存在于您網(wǎng)絡(luò)的內(nèi)部。網(wǎng)絡(luò)接口的實用性以及可以部署多個 memcached 實例的簡便性讓您可以使用多個機器上的多余 RAM 來提高您緩存的整體大小。memcached 的存儲方法是一個簡單的鍵/值對,類似于很多語言內(nèi)的散列或關(guān)聯(lián)數(shù)組。通過提供鍵和值來將信息存儲到 memcached 內(nèi),通過按特定的鍵請求信息來恢復(fù)信息。信息會無限期地保留在緩存內(nèi),除非發(fā)生如下的情況:1. 為緩存分配的內(nèi)存耗盡 在這種情況下,memcached 使用 LRU(最近最少使用)方
23、法從此緩存刪除條目。最近未曾使用的條目會從此緩存中先刪除,最舊的最先訪問。2. 條目被明確刪除 總是可以從此緩存內(nèi)刪除條目。3. 條目過期失效 各條目均有一個有效的期限以便針對此鍵存儲的信息在過于陳舊時可從緩存中清除這些條目。上述這些情況可以與您應(yīng)用程序的邏輯綜合使用以便確保緩存內(nèi)的信息是最新的。有了這些基礎(chǔ)知識后,讓我們來看看在應(yīng)用程序內(nèi)如何能最好地利用 memcached。2何時使用 memcached在使用 memcached 改進應(yīng)用程序性能時,可以對一些關(guān)鍵的過程和步驟進行修改。在加載信息時,典型的場景下圖所示。一般而言,這些步驟是:1. 執(zhí)行一個或多個查詢來從數(shù)據(jù)庫加載信息2. 格
24、式化適合于顯示(或進一步處理)的信息3. 使用或顯示格式化了的數(shù)據(jù)在使用 memcached 時,為配合這個緩存,可對應(yīng)用程序的邏輯進行稍許修改: 盡量從緩存加載信息 如果存在,使用信息的被緩存版本 如果它不存在:1. 執(zhí)行一個或多個查詢來從數(shù)據(jù)庫加載信息2. 格式化適合于顯示或進一步處理的信息3. 將信息存儲到緩存內(nèi)4. 使用格式化了的數(shù)據(jù)下面是對這些步驟的總結(jié)。數(shù)據(jù)加載成為了至多三個步驟的一個過程,從緩存加載數(shù)據(jù)或從數(shù)據(jù)庫(視情況而定)加載數(shù)據(jù)并存儲在緩存內(nèi)。當(dāng)這個過程首次發(fā)生時,數(shù)據(jù)將正常地從數(shù)據(jù)庫或其他數(shù)據(jù)源加載,然后再存儲到 memcached 內(nèi)。當(dāng)下一次訪問此信息時,它就會從 m
25、emcached 拉出,而不是從數(shù)據(jù)庫加載,節(jié)省了時間和 CPU 循環(huán)。問題的另一個方面是要確保如果更改了要存儲在 memcached 內(nèi)的信息,在更新后端信息的同時還要更新 memcached 的版本在一個典型的應(yīng)用程序內(nèi)更新或存儲數(shù)據(jù)比如,仍以博客站點為例,在博客系統(tǒng)更新數(shù)據(jù)庫內(nèi)的類別列表時,更新應(yīng)該遵循如下順序:1. 更新數(shù)據(jù)庫內(nèi)的類別列表2. 格式化信息3. 將信息存儲到 memcached 內(nèi)4. 將信息返回至客戶機memcached 內(nèi)的存儲操作是原子的,所以信息的更新不會讓客戶機只獲得部分數(shù)據(jù);它們獲得的或者是老版本,或者是新版本。對于大多數(shù)應(yīng)用程序,這兩個操作是您惟一需要注意的
26、。在訪問他人使用的數(shù)據(jù)時,它會自動被添加到這個緩存內(nèi),而且如果對該數(shù)據(jù)進行了更改,此緩存內(nèi)也會自動進行更新。3鍵、名稱空間和值memcached 另一個需要重點考慮的因素是如何組織和命名存儲在緩存內(nèi)的這些數(shù)據(jù)。從之前博客站點的例子中,不難看出需要使用一種一致的命名結(jié)構(gòu)以便您能加載博客類別、歷史和其他信息,然后再在加載信息(并更新緩存)時或者在更新數(shù)據(jù)(同樣也要更新緩存)時使用。使用的何種具體的命名系統(tǒng)特定于應(yīng)用程序,但通??梢允褂靡环N與現(xiàn)有應(yīng)用程序類似的結(jié)構(gòu),并且這種結(jié)構(gòu)很可能基于某種惟一識別符。當(dāng)從數(shù)據(jù)庫拉出信息或在整理信息集時,就會發(fā)生這種情況。以 blog post 為例,可以在一個具有
27、鍵 category-list 的項中存儲類別列表。與此 post ID 對應(yīng)的單個 post,比如 blogpost-29 相關(guān)的值都可以使用,而該項的注釋則可以存儲在 blogcomments-29 內(nèi),其中 29 就是這個 blog post 的 ID。這樣一來, 您就可以將各種各樣的信息存儲在緩存內(nèi),使用不同的前綴來標識這些信息。在存儲值的方面,應(yīng)該確保存儲在緩存內(nèi)的信息適合于您的應(yīng)用程序。比如,對于這個博客系統(tǒng),您可能想要存儲被博客應(yīng)用程序使用的對象以便格式化博客信息,而不是原始的 HTML。如果同一個基礎(chǔ)結(jié)構(gòu)用在應(yīng)用程序內(nèi)的多個地方,這一點更具實用性。大多數(shù)語言的接口,包括 Jav
28、a、Perl、PHP 等,都能串行化語言對象以便存儲在 memcached 內(nèi)。這就讓您可以存儲并隨后從內(nèi)存存儲恢復(fù)全部對象,而不是在您的應(yīng)用程序內(nèi)手動重構(gòu)它們。 很多對象,或它們使用的結(jié)構(gòu),都基于某種散列或數(shù)組結(jié)構(gòu)。對于跨語言的環(huán)境,比如在 JSP 環(huán)境和 JavaScript 環(huán)境間共享相同信息,可以使用一種架構(gòu)中立的格式,比如 JavaScript Object Notation (JSON) 甚或 XML。4填充并使用 memcached作為一種開源產(chǎn)品以及一種最初開發(fā)用來工作于現(xiàn)有開源環(huán)境內(nèi)的產(chǎn)品,memcached 受大量環(huán)境和平臺支持。與 memcached 服務(wù)器通信的接口有很
29、多,并常常具有針對所有語言的多個實現(xiàn)。要列出所有受支持的接口和環(huán)境不太可能,但它們均支持 memcached 協(xié)議提供的基礎(chǔ) API。這些描述已經(jīng)被簡化并應(yīng)用在不同語言的上下文內(nèi),在這些語言中,使用不同的值可指示錯誤。主要的函數(shù)有: get(key) 從存儲了特定鍵的 memcached 獲得信息。 如果鍵不存在,就返回錯誤。 set(key, value , expiry) 使用緩存內(nèi)的標識符鍵存儲這個特定的值。如果鍵已經(jīng)存在,那么它就會被更新。期滿時間的單位為秒,并且如果值小于 30 天 (30*24*60*60),那么就用作相對時間,如果值大于 30 天,那么就用作絕對時間 (epoch
30、)。 add(key, value , expiry) 如果鍵不存在就將這個鍵添加到緩存內(nèi),如果鍵已經(jīng)存在就返回錯誤。如果您想要顯式地添加一個新鍵而又不會因它已經(jīng)存在而更新它,那么這個函數(shù)將十分有用。 replace(key, value , expiry) 更新此特定鍵的值,如果鍵不存在就返回一個錯誤。 delete(key , time) 從緩存中刪除此鍵/值對。如果您提供一個時間,那么添加具有此鍵的一個新值就會被阻塞這個特定的時期。超時讓您可以確保此值總是可以重新讀取自您的數(shù)據(jù)中心。 incr(key , value) 為特定的鍵增 1 或特定的值。只適用于數(shù)值。 decr(key ,
31、value) 為特定的鍵減 1 或特定的值,只適用于數(shù)值。 flush_all 讓緩存內(nèi)的所有當(dāng)前條目無效(或到期失效)。比如,在 Perl 內(nèi),基本 set 操作可以如清單 1 所示的那樣處理。清單 1. Perl 內(nèi)的基本 set 操作1use Cache:Memcached;23my $cache = new Cache:Memcached 4servers = 5localhost:11211,6,7;89$cache-set(mykey, myvalue);Ruby 內(nèi)的相同的基本操作如清單 2 所示。清單 2. Ruby 內(nèi)的基本 set 操作1require memcache2m
32、emc = MemCache:new 00:1121134memcmykey = myvalue在兩個例子中可以看到相同的基本結(jié)構(gòu):設(shè)置 memcached 服務(wù)器,然后分配或設(shè)置值。其他的接口也可用,包括適合于 Java 技術(shù)的那些接口,讓您可以在 WebSphere 應(yīng)用程序內(nèi)使用 memcached。memcached 接口類允許將 Java 對象直接序列化到 memcached 以便于存儲和加載復(fù)雜的結(jié)構(gòu)。當(dāng)在像 WebSphere 這樣的環(huán)境內(nèi)進行部署時,有兩個事情非常重要:服務(wù)的彈性(在 memcached 不可用時如何做)以及如何提高緩存存儲量來改進在使用多
33、個應(yīng)用程序服務(wù)器或在使用像 WebSphere eXtreme Scale 這樣的環(huán)境時的性能。我們接下來就來看看這兩個問題。5彈性和可用性有關(guān) memcached 最常見的一個問題是:“若緩存不可用了,會發(fā)生什么情況呢?”正如之前章節(jié)中明示的,緩存內(nèi)的信息不應(yīng)該成為信息的的惟一資源。必須要能夠從其他位置加載存儲在緩存內(nèi)的數(shù)據(jù)。雖然,無法從緩存訪問信息將會減緩應(yīng)用程序的性能,但它不應(yīng)該阻止應(yīng)用程序的運轉(zhuǎn)。可能會發(fā)生這樣幾個場景:1如果 memcached 服務(wù)宕掉,應(yīng)用程序應(yīng)該回退到從原始數(shù)據(jù)源加載信息并對信息進行顯示所需的格式化。此應(yīng)用程序還應(yīng)繼續(xù)嘗試在 memcached 內(nèi)加載和存儲信息
34、。2一旦 memcached 服務(wù)器恢復(fù)可用,應(yīng)用程序就應(yīng)該自動嘗試存儲數(shù)據(jù)。沒有必要強制重載已緩存了的數(shù)據(jù),可以使用標準的訪問來用信息加載和填充緩存。最終,緩存將會被最常用的數(shù)據(jù)重新填充。再次重申,memcached 是信息的緩存但并非惟一的數(shù)據(jù)源。memcached 服務(wù)器不可用不應(yīng)該是應(yīng)用程序的終結(jié),雖然這意味著在 memcached 服務(wù)器恢復(fù)正常之前性能會有所降低。實際上,memcached 服務(wù)器相對簡單,并且雖然不是絕對無故障的,但它的簡單性的結(jié)果就是它很少會出錯。6分配緩存memcached 服務(wù)器只是網(wǎng)絡(luò)上針對一些鍵存儲值的一個緩存。如果有多臺機器,那么很自然地會想要在所有多
35、余機器上設(shè)置一個 memcached 的實例來提供一個超大的聯(lián)網(wǎng) RAM 緩存存儲。有了這個想法后,還有一種想當(dāng)然是需要使用某種分配或復(fù)制機制來在機器之間復(fù)制鍵/值對。這種方式的問題是如果這么做反而會減少可用的 RAM 緩存,而不是增加。如圖 6 所示,可以看出這里有三個應(yīng)用程序服務(wù)器,每個服務(wù)器都可以訪問一個 memcached 實例。多重 memcached 實例的不正確使用盡管每個 memcached 實例都是 1 GB 的大?。óa(chǎn)生 3 GB 的 RAM 緩存),但如果每個應(yīng)用程序服務(wù)器只有其自己的緩存(或者在 memcached 之間存在著數(shù)據(jù)的復(fù)制),那么整個安裝也仍只能有 1 G
36、B 的緩存在每個實例間復(fù)制。由于 memcached 通過一個網(wǎng)絡(luò)接口提供信息,因此單個的客戶機可以從它所能訪問的任何一個 memcached 實例訪問數(shù)據(jù)。如果數(shù)據(jù)沒有跨每個實例被復(fù)制,那么最終在每個應(yīng)用程序服務(wù)器上,就可以有 3 GB 的 RAM 緩存可用。多重 memcached 實例的正確使用這個方法的問題是選擇哪個服務(wù)器來儲存鍵/值對,以及當(dāng)想要重新獲得一個值時,如何決定要與哪個 memcached 服務(wù)器對話。問題的解決方案就是忽略復(fù)雜的東西,比如查找表,或是寄望 memcached 服務(wù)器來為您處理這個過程。而 memcached 客戶機則必須要力求簡單。memcached 客戶
37、機不必決定此信息,它只需對在存儲信息時指定的鍵使用一個簡單的散列算法。當(dāng)想要從一列 memcached 服務(wù)器存儲或獲取信息時,memcached 客戶機就會用一個一致的散列算法從這個鍵獲取一個數(shù)值。舉個例子,鍵 mykey 被轉(zhuǎn)換成數(shù)值 23875 。是保存還是獲取信息無關(guān)緊要,這個鍵將總是被用作惟一標識符來從 memcached 服務(wù)器加載,因此在本例中,“mykey” 散列轉(zhuǎn)化后對應(yīng)的值總是 23875。如果有兩個服務(wù)器,那么 memcached 客戶機將對這個數(shù)值進行一個簡單的運算(例如,系數(shù))來決定它應(yīng)將此值存儲在第一個還是第二個配置了的 memcached 實例上。當(dāng)存儲一個值時,
38、客戶機會從這個鍵確定出散列值以及它原來存儲在哪個服務(wù)器上。當(dāng)獲取一個值時,客戶機會從這個鍵確定出相同的散列值并會選擇相同的服務(wù)器來獲取信息。如果在每個應(yīng)用程序服務(wù)器上使用的是相同的服務(wù)器列表(并且順序相同),那么當(dāng)需要保存或檢索同一個鍵時,每個應(yīng)用程序服務(wù)器都將選擇同一個服務(wù)器?,F(xiàn) 在,在這個例子中,有 3GB 的 memcached 空間可以共享,而不是同一個 1 GB 的空間的復(fù)制,這就帶來了更多的可用緩存,并很有可能會提高有多個用戶情況下的應(yīng)用程序的性能。7如何能不使用 memcached盡管 memcached 很簡單,但 memcached 實例有時候還是會被不正確地使用。7.1me
39、mcached 不是一個數(shù)據(jù)庫最常見的 memcached 誤用就是把它用作一個數(shù)據(jù)存儲,而不是一個緩存。memcached 的首要目的就是加快數(shù)據(jù)的響應(yīng)時間,否則數(shù)據(jù)從其他數(shù)據(jù)源構(gòu)建或恢復(fù)需要很長時間。一個典型的例子就是從一個數(shù)據(jù)庫中恢復(fù)信息,特別是在信息顯示給用戶前 需要對信息進行格式化或處理的時候。Memcached 被設(shè)計用來將信息存儲在內(nèi)存中以避免每次在數(shù)據(jù)需要恢復(fù)時重復(fù)執(zhí)行相同的任務(wù)。切不可將 memcached 用作運行應(yīng)用程序所需信息的惟一信息源;數(shù)據(jù)應(yīng)總是可以從其他信息源獲取。此外,要記住 memcached 只是一個鍵/值的存儲。不能在數(shù)據(jù)上執(zhí)行查詢,或者對內(nèi)容進行迭代來提
40、取信息。應(yīng)該使用它來存儲數(shù)據(jù)塊或?qū)ο笠詡渑渴褂谩?.2不要緩存數(shù)據(jù)庫行或文件雖然可以使用 memcached 存儲加載自數(shù)據(jù)庫的數(shù)據(jù)行,但這實際上是查詢緩存,并且大多數(shù)數(shù)據(jù)庫都提供各自的查詢緩存的機制。其他的對象,比如文件系統(tǒng)的圖像或文件的情況與此相同。很多應(yīng)用程序和 web 服務(wù)器針對此類工作已經(jīng)有了一些很好的解決方案。如果在加載和格式化后,使用它來存儲全部信息塊,就可以從 memcached 獲得更多的實用工具和性能上的改善。仍以我們的博客站點為例,存儲信息的最佳點是在將博客類別格式化為對象,甚至是在格式化成 HTML 后。博客頁面的構(gòu)造可通過從 memcached 加載各個組件(比如
41、blog post、category list、post history 等)并將完成的 HTML 寫回至客戶機實現(xiàn)。7.3memcached 并不安全為了確保最佳性能,memcached 并未提供任何形式的安全性,沒有身份驗證,也沒有加密。這意味著對 memcached 服務(wù)器的訪問應(yīng)該這么處理:一是通過將它們放到應(yīng)用程序部署環(huán)境相同的私有側(cè),二是如果安全性是必須的,那么就使用 UNIX socket 并只允許當(dāng)前主機上的應(yīng)用程序訪問此 memcached 服務(wù)器。這多少犧牲了一些靈活性和彈性,以及跨網(wǎng)絡(luò)上的多臺機器共享 RAM 緩存的能力,但這是在目前的情況下確保 memcached 數(shù)據(jù)
42、安全性的惟一一種解決方案。8不要限制自己除了不應(yīng)該使用 memcached 實例的情況外,memcached 的靈活性不應(yīng)忽視。由于 memcached 與應(yīng)用程序處于相同的架構(gòu)水平,所以很容易集成并連接到它。并且更改應(yīng)用程序以便利用 memcached 也并不復(fù)雜。此外,由于 memcached 只是一個緩存,所以在出現(xiàn)問題時它不會停止應(yīng)用程序的執(zhí)行。如果使用正確的話,它所做的是減輕其余服務(wù)器基礎(chǔ)設(shè)施的負載(減少對數(shù)據(jù)庫和數(shù)據(jù)源的讀操 作),這意味著無需更多的硬件就可以支持更多的客戶機。但請記住,它僅僅是個緩存!9結(jié)束語在本文中,我們了解了 memcached 以及如何最佳地使用它。我們看到
43、了信息如何存儲、如何選擇合理的鍵以及如何選擇要存儲的信息。我們還討論了所有 memcached 用戶都要遇到的一些關(guān)鍵的部署問題,包括多服務(wù)器的使用、當(dāng) memcached 實例消亡時該怎么做,以及(也許最為重要的)在哪些情況下不能使用 memcached。作為一種開源的應(yīng)用程序并且是目的簡單而直白的應(yīng)用程序,memcached 的功能和實用性均來自于這種簡單性。通過為信息提供巨大的 RAM 存儲空間、讓它在網(wǎng)絡(luò)上可用,然后再讓它可通過各種不同的接口和語言訪問到,memcached 可被集成到多種多樣的安裝和環(huán)境中。Stat命令tats查看memcached狀態(tài)的基本命令,通過這個命令可以看到
44、如下信息:STAT pid 22459 進程IDSTAT uptime 服務(wù)器運行秒數(shù)STAT time 服務(wù)器當(dāng)前unix時間戳STAT version 1.4.4 服務(wù)器版本STAT pointer_size 64 操作系統(tǒng)字大小(這臺服務(wù)器是64位的)STAT rusage_user 0. 進程累計用戶時間STAT rusage_system 0. 進程累計系統(tǒng)時間STAT curr_connections 10 當(dāng)前打開連接數(shù)STAT total_connections 82 曾打開的連接總數(shù)STAT connection_structures 13 服務(wù)器分配的連接結(jié)構(gòu)數(shù)STAT c
45、md_get 54 執(zhí)行g(shù)et命令總數(shù)STAT cmd_set 34 執(zhí)行set命令總數(shù)STAT cmd_flush 3 指向flush_all命令總數(shù)STAT get_hits 9 get命中次數(shù)STAT get_misses 45 get未命中次數(shù)STAT delete_misses 5 delete未命中次數(shù)STAT delete_hits 1 delete命中次數(shù)STAT incr_misses 0 incr未命中次數(shù)STAT incr_hits 0 incr命中次數(shù)STAT decr_misses 0 decr未命中次數(shù)STAT decr_hits 0 decr命中次數(shù)STAT ca
46、s_misses 0 cas未命中次數(shù)STAT cas_hits 0 cas命中次數(shù)STAT cas_badval 0 使用擦拭次數(shù)STAT auth_cmds 0STAT auth_errors 0STAT bytes_read 15785 讀取字節(jié)總數(shù)STAT bytes_written 15222 寫入字節(jié)總數(shù)STAT limit_maxbytes 分配的內(nèi)存數(shù)(字節(jié))STAT accepting_conns 1 目前接受的鏈接數(shù)STAT listen_disabled_num 0 STAT threads 4 線程數(shù)STAT conn_yields 0STAT bytes 0 存儲it
47、em字節(jié)數(shù)STAT curr_items 0 item個數(shù)STAT total_items 34 item總數(shù)STAT evictions 0 為獲取空間刪除item的總數(shù)stats items輸出各個slab中的item信息。sstats slabs輸出slab中更詳細的item信息stats sizes輸出所有item的大小和個數(shù)stats cachedump 根據(jù)輸出相同的中的item信息。是輸出的個數(shù),當(dāng)為0是輸出所有的item。漂亮的分割線NoSQL開篇為什么要使用NoSQLNoSQL概念隨著web2.0的快速發(fā)展,非關(guān)系型、分布式數(shù)據(jù)存儲得到了快速的發(fā)展,它們不保證關(guān)系數(shù)據(jù)的ACI
48、D特性。NoSQL概念在2009年被提了出來。NoSQL最常見的解釋是“non-relational”,“Not Only SQL”也被很多人接受。(“NoSQL”一詞最早于1998年被用于一個輕量級的關(guān)系數(shù)據(jù)庫的名字。)NoSQL被我們用得最多的當(dāng)數(shù)key-value存儲,當(dāng)然還有其他的文檔型的、列存儲、圖型數(shù)據(jù)庫、xml數(shù)據(jù)庫等。在NoSQL概念提出之前,這些數(shù)據(jù)庫就被用于各種系統(tǒng)當(dāng)中,但是卻很少用于web互聯(lián)網(wǎng)應(yīng)用。比如cdb、qdbm、bdb數(shù)據(jù)庫。傳統(tǒng)關(guān)系數(shù)據(jù)庫的瓶頸傳統(tǒng)的關(guān)系數(shù)據(jù)庫具有不錯的性能,高穩(wěn)定型,久經(jīng)歷史考驗,而且使用簡單,功能強大,同時也積累了大量的成功案例。在互聯(lián)網(wǎng)領(lǐng)
49、域,MySQL成為了絕對靠前的王者,毫不夸張的說,MySQL為互聯(lián)網(wǎng)的發(fā)展做出了卓越的貢獻。在90年代,一個網(wǎng)站的訪問量一般都不大,用單個數(shù)據(jù)庫完全可以輕松應(yīng)付。在那個時候,更多的都是靜態(tài)網(wǎng)頁,動態(tài)交互類型的網(wǎng)站不多。到了最近10年,網(wǎng)站開始快速發(fā)展?;鸨恼搲?、博客、sns、微博逐漸引領(lǐng)web領(lǐng)域的潮流。在初期,論壇的流量其實也不大,如果你接觸網(wǎng)絡(luò)比較早,你可能還記得那個時候還有文本型存儲的論壇程序,可以想象一般的論壇的流量有多大。Memcached+MySQL后來,隨著訪問量的上升,幾乎大部分使用MySQL架構(gòu)的網(wǎng)站在數(shù)據(jù)庫上都開始出現(xiàn)了性能問題,web程序不再僅僅專注在功能上,同時也在追
50、求性 能。程序員們開始大量的使用緩存技術(shù)來緩解數(shù)據(jù)庫的壓力,優(yōu)化數(shù)據(jù)庫的結(jié)構(gòu)和索引。開始比較流行的是通過文件緩存來緩解數(shù)據(jù)庫壓力,但是當(dāng)訪問量繼續(xù)增大 的時候,多臺web機器通過文件緩存不能共享,大量的小文件緩存也帶了了比較高的IO壓力。在這個時候,Memcached就自然的成為一個非常時尚的技 術(shù)產(chǎn)品。Memcached作為一個獨立的分布式的緩存服務(wù)器,為多個web服務(wù)器提供了一個共享的高性能緩存服務(wù),在Memcached服務(wù)器上,又發(fā)展 了根據(jù)hash算法來進行多臺Memcached緩存服務(wù)的擴展,然后又出現(xiàn)了一致性hash來解決增加或減少緩存服務(wù)器導(dǎo)致重新hash帶來的大量緩存 失效的弊
51、端。當(dāng)時,如果你去面試,你說你有Memcached經(jīng)驗,肯定會加分的。Mysql主從讀寫分離由于數(shù)據(jù)庫的寫入壓力增加,Memcached只能緩解數(shù)據(jù)庫的讀取壓力。讀寫集中在一個數(shù)據(jù)庫上讓數(shù)據(jù)庫不堪重負,大部分網(wǎng)站開始使用主從復(fù)制技術(shù)來達到讀寫分離,以提高讀寫性能和讀庫的可擴展性。Mysql的master-slave模式成為這個時候的網(wǎng)站標配了。分表分庫隨著web2.0的繼續(xù)高速發(fā)展,在Memcached的高速緩存,MySQL的主從復(fù)制,讀寫分離的基礎(chǔ)之上,這時MySQL主庫的寫壓力開始出現(xiàn)瓶 頸,而數(shù)據(jù)量的持續(xù)猛增,由于MyISAM使用表鎖,在高并發(fā)下會出現(xiàn)嚴重的鎖問題,大量的高并發(fā)MySQL
52、應(yīng)用開始使用InnoDB引擎代替 MyISAM。同時,開始流行使用分表分庫來緩解寫壓力和數(shù)據(jù)增長的擴展問題。這個時候,分表分庫成了一個熱門技術(shù),是面試的熱門問題也是業(yè)界討論的熱門 技術(shù)問題。也就在這個時候,MySQL推出了還不太穩(wěn)定的表分區(qū),這也給技術(shù)實力一般的公司帶來了希望。雖然MySQL推出了MySQL Cluster集群,但是由于在互聯(lián)網(wǎng)幾乎沒有成功案例,性能也不能滿足互聯(lián)網(wǎng)的要求,只是在高可靠性上提供了非常大的保證。MySQL的擴展性瓶頸在互聯(lián)網(wǎng),大部分的MySQL都應(yīng)該是IO密集型的,事實上,如果你的MySQL是個CPU密集型的話,那么很可能你的MySQL設(shè)計得有性能問 題,需要優(yōu)化了。大數(shù)據(jù)量高并發(fā)環(huán)境下的MySQL應(yīng)用開發(fā)越來越復(fù)雜,也越來越具有技術(shù)挑戰(zhàn)性。分表分庫的規(guī)則把握都是需要經(jīng)驗的。雖然有像淘寶這樣技 術(shù)實力強大的公司開發(fā)了透明的中間件層來屏蔽開發(fā)者的復(fù)雜性,但是避免不了整個架構(gòu)的復(fù)雜性。分庫分表的子庫到一定階段又面臨擴展問題。還有就是需求的變 更,可能又需要一種新的分庫方式。MySQL數(shù)據(jù)庫也經(jīng)常存儲一些大文本字段,導(dǎo)致數(shù)據(jù)庫表非常的大,在做數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 病區(qū)剩余藥品管理制度(3篇)
- 社工元旦活動方案策劃(3篇)
- 船員不誠信行為管理制度(3篇)
- 藍光發(fā)展內(nèi)部管理制度(3篇)
- 課程和教學(xué)管理制度(3篇)
- 酒肉館活動方案策劃(3篇)
- 青年志愿活動策劃方案(3篇)
- 2025年護士合同期滿工作總結(jié)(3篇)
- 2026年武漢武鍋能源工程有限公司招聘備考題庫附答案詳解
- 2025年高職機器人運維工程師(機器人調(diào)試技術(shù))試題及答案
- 粉塵清掃安全管理制度完整版
- 云南省2025年高二上學(xué)期普通高中學(xué)業(yè)水平合格性考試《信息技術(shù)》試卷(解析版)
- 2025年山東青島西海岸新區(qū)“千名人才進新區(qū)”集中引才模擬試卷及一套完整答案詳解
- 四川省成都市樹德實驗中學(xué)2026屆九年級數(shù)學(xué)第一學(xué)期期末監(jiān)測試題含解析
- 與業(yè)主溝通技巧培訓(xùn)
- 普惠托育服務(wù)機構(gòu)申請表、承諾書、認定書
- 幼兒園小班數(shù)學(xué)《好吃的》課件
- 《海洋生物學(xué)》課程教學(xué)大綱
- 對公賬戶收款變更協(xié)議書
- 低壓控制基本知識培訓(xùn)課件
- 2025至2030中國養(yǎng)老健康行業(yè)深度發(fā)展研究與企業(yè)投資戰(zhàn)略規(guī)劃報告
評論
0/150
提交評論