Memcached 原理剖析.ppt_第1頁(yè)
Memcached 原理剖析.ppt_第2頁(yè)
Memcached 原理剖析.ppt_第3頁(yè)
Memcached 原理剖析.ppt_第4頁(yè)
Memcached 原理剖析.ppt_第5頁(yè)
已閱讀5頁(yè),還剩36頁(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入門(mén),作者:,2009-01,2,Memcache是什么Memcache,ehcache的比較Memcache原理分析Memcache安裝和基本配置Memcache的在大型網(wǎng)站中的使用策略Memcache的一些經(jīng)驗(yàn)和技巧Memcache一致性算法(consistenthasing),TechTalk目錄索引,3,Memcache是什么:,Memcache是國(guó)外社區(qū)網(wǎng)站LiveJournal的開(kāi)發(fā)團(tuán)隊(duì)開(kāi)發(fā)的高性能的分布式內(nèi)存緩存服務(wù)器。一般的使用目的是,通過(guò)緩存數(shù)據(jù)庫(kù)查詢(xún)結(jié)果,減少數(shù)據(jù)庫(kù)訪問(wèn)次數(shù),以提高動(dòng)態(tài)Web應(yīng)用的速度、提高可擴(kuò)展性。目前全世界不少人使用這個(gè)緩存項(xiàng)目來(lái)構(gòu)建自己大負(fù)載的網(wǎng)站,來(lái)分擔(dān)數(shù)據(jù)庫(kù)的壓力。Memcache可以對(duì)任意多個(gè)連接,使用非阻塞的網(wǎng)絡(luò)IO。由于它的工作機(jī)制是在內(nèi)存中開(kāi)辟一塊空間,然后建立一個(gè)HashTable,Memcache自管理這些HashTable.Memcache的官方網(wǎng)站:,4,Memcache,EhCache的比較,5,Memcache原理分析,Memcache工作方式?,6,Memcache原理分析,7,Memcache原理分析,自主的內(nèi)存存儲(chǔ)處理數(shù)據(jù)存儲(chǔ)方式:SlabAllocation數(shù)據(jù)過(guò)期方式:LazyExpiration+LRU,8,Memcache原理分析,數(shù)據(jù)存儲(chǔ)方式:SlabAllocationSlabAlloction構(gòu)造圖,SlabAllocator的基本原理是按照預(yù)先規(guī)定的大小,將分配的內(nèi)存分割成特定長(zhǎng)度的塊,以完全解決內(nèi)存碎片問(wèn)題。SlabAllocation的原理相當(dāng)簡(jiǎn)單。將分配的內(nèi)存分割成各種尺寸的塊(chunk),并把尺寸相同的塊分成組(chunk的集合),9,Memcache原理分析,數(shù)據(jù)存儲(chǔ)方式:SlabAllocationSlabClasses分配圖,Page:分配給Slab的內(nèi)存空間,默認(rèn)是1MB。分配給Slab之后根據(jù)slab的大小切分成chunk。Chunk:用于緩存記錄的內(nèi)存空間。SlabClass:特定大小的chunk的組。memcached根據(jù)收到的數(shù)據(jù)的大小,選擇最適合數(shù)據(jù)大小的slab。memcached中保存著slab內(nèi)空閑chunk的列表,根據(jù)該列表選擇chunk,然后將數(shù)據(jù)緩存于其中。,10,Memcache原理分析:,數(shù)據(jù)存儲(chǔ)方式:SlabAllocationSlabAlloction缺點(diǎn),這個(gè)問(wèn)題就是,由于分配的是特定長(zhǎng)度的內(nèi)存,因此無(wú)法有效利用分配的內(nèi)存。例如,將100字節(jié)的數(shù)據(jù)緩存到128字節(jié)的chunk中,剩余的28字節(jié)就浪費(fèi)了。,11,Memcache原理分析:,數(shù)據(jù)過(guò)期方式LazyExpirationmemcached內(nèi)部不會(huì)監(jiān)視記錄是否過(guò)期,而是在get時(shí)查看記錄的時(shí)間戳,檢查記錄是否過(guò)期。這種技術(shù)被稱(chēng)為lazy(惰性)expiration。因此,memcached不會(huì)在過(guò)期監(jiān)視上耗費(fèi)CPU時(shí)間。LRUmemcached會(huì)優(yōu)先使用已超時(shí)的記錄的空間,但即使如此,也會(huì)發(fā)生追加新記錄時(shí)空間不足的情況,此時(shí)就要使用名為L(zhǎng)eastRecentlyUsed(LRU)機(jī)制來(lái)分配空間。顧名思義,這是刪除“最近最少使用”的記錄的機(jī)制。因此,當(dāng)memcached的內(nèi)存空間不足時(shí)(無(wú)法從slabclass獲取到新的空間時(shí)),就從最近未被使用的記錄中搜索,并將其空間分配給新的記錄。從緩存的實(shí)用角度來(lái)看,該模型十分理想。,12,Memcache原理分析:,基于客戶端的Memcached分布式,13,Memcache原理分析:,基于客戶端的Memcached分布式,/按照Key值,獲取一個(gè)服務(wù)器IDintgetServerId(char*key,intserverTotal)intc,hash=0;while(c=*key+)hash+=c;returnhash%serverTotal;/服務(wù)器列表node0=:11211node1=:11211node2=:11211/獲取key是tokyo的節(jié)點(diǎn)ID(服務(wù)器ID)intid=getServerId(test,3);/得出的結(jié)果是1,那么對(duì)應(yīng)的機(jī)器就是nodeid=node1,14,Memcache原理分析:,基于客戶端的Memcached分布式寫(xiě)入操作讀取操作,15,Memcache原理分析:,Memcache的理論參數(shù)計(jì)算方式常量REALTIME_MAXDELTA60*60*24*30最大30天的過(guò)期時(shí)間conn_init()中的freetotal(=200)最大同時(shí)連接數(shù)常量KEY_MAX_LENGTH250最大鍵長(zhǎng)settings.factor(=1.25)factor將影響chunk的步進(jìn)大小settings.maxconns(=1024)最大軟連接settings.chunk_size(=48)一個(gè)保守估計(jì)的key+value長(zhǎng)度,用來(lái)生成id1中的chunk長(zhǎng)度(1.2)。id1的chunk長(zhǎng)度等于這個(gè)數(shù)值加上item結(jié)構(gòu)體的長(zhǎng)度(32),即默認(rèn)的80字節(jié)。常量POWER_SMALLEST1最小classid(1.2)常量POWER_LARGEST200最大classid(1.2),16,Memcache原理分析:,常量POWER_BLOCK1048576默認(rèn)slab大小常量CHUNK_ALIGN_BYTES(sizeof(void*)保證chunk大小是這個(gè)數(shù)值的整數(shù)倍,防止越界(void*的長(zhǎng)度在不同系統(tǒng)上不一樣,在標(biāo)準(zhǔn)32位系統(tǒng)上是4)常量ITEM_UPDATE_INTERVAL60隊(duì)列刷新間隔常量LARGEST_ID255最大item鏈表數(shù)(這個(gè)值不能比最大的classid?。┳兞縣ashpower(在1.1中是常量HASHPOWER)決定hashtable的大小根據(jù)上面介紹的內(nèi)容及參數(shù)設(shè)定,可以計(jì)算出的一些結(jié)果:1、在memcached中可以保存的item個(gè)數(shù)是沒(méi)有軟件上限的,之前我的100萬(wàn)的說(shuō)法是錯(cuò)誤的。2、假設(shè)NewHash算法碰撞均勻,查找item的循環(huán)次數(shù)是item總數(shù)除以hashtable大?。ㄓ蒱ashpower決定),是線性的。3、Memcached限制了可以接受的最大item是1MB,大于1MB的數(shù)據(jù)不予理會(huì)。4、Memcached的空間利用率和數(shù)據(jù)特性有很大的關(guān)系,又與DONT_PREALLOC_SLABS常量有關(guān)。在最差情況下,有198個(gè)slab會(huì)被浪費(fèi)(所有item都集中在一個(gè)slab中,199個(gè)id全部分配滿)。,17,Memcache原理分析:,Memcache的定長(zhǎng)優(yōu)化根據(jù)上面幾節(jié)的描述,多少對(duì)memcached有了一個(gè)比較深入的認(rèn)識(shí)。在深入認(rèn)識(shí)的基礎(chǔ)上才好對(duì)它進(jìn)行優(yōu)化。Memcached本身是為變長(zhǎng)數(shù)據(jù)設(shè)計(jì)的,根據(jù)數(shù)據(jù)特性,可以說(shuō)它是“面向大眾”的設(shè)計(jì),但是很多時(shí)候,我們的數(shù)據(jù)并不是這樣的“普遍”,典型的情況中,一種是非均勻分布,即數(shù)據(jù)長(zhǎng)度集中在幾個(gè)區(qū)域內(nèi)(如保存用戶Session);另一種更極端的狀態(tài)是等長(zhǎng)數(shù)據(jù)(如定長(zhǎng)鍵值,定長(zhǎng)數(shù)據(jù),多見(jiàn)于訪問(wèn)、在線統(tǒng)計(jì)或執(zhí)行鎖)。這里主要研究一下定長(zhǎng)數(shù)據(jù)的優(yōu)化方案(1.2),集中分布的變長(zhǎng)數(shù)據(jù)僅供參考,實(shí)現(xiàn)起來(lái)也很容易。解決定長(zhǎng)數(shù)據(jù),首先需要解決的是slab的分配問(wèn)題,第一個(gè)需要確認(rèn)的是我們不需要那么多不同chunk長(zhǎng)度的slab,為了最大限度地利用資源,最好chunk和item等長(zhǎng),所以首先要計(jì)算item長(zhǎng)度。在之前已經(jīng)有了計(jì)算item長(zhǎng)度的算法,需要注意的是,除了字符串長(zhǎng)度外,還要加上item結(jié)構(gòu)的長(zhǎng)度32字節(jié)。假設(shè)我們已經(jīng)計(jì)算出需要保存200字節(jié)的等長(zhǎng)數(shù)據(jù)。接下來(lái)是要修改slab的classid和chunk長(zhǎng)度的關(guān)系。在原始版本中,chunk長(zhǎng)度和classid是有對(duì)應(yīng)關(guān)系的,現(xiàn)在如果把所有的chunk都定為200個(gè)字節(jié),那么這個(gè)關(guān)系就不存在了,我們需要重新確定這二者的關(guān)系。一種方法是,整個(gè)存儲(chǔ)結(jié)構(gòu)只使用一個(gè)固定的id,即只使用199個(gè)槽中的1個(gè),在這種條件下,就一定,18,Memcache原理分析:,要定義DONT_PREALLOC_SLABS來(lái)避免另外的預(yù)分配浪費(fèi)。另一種方法是建立一個(gè)hash關(guān)系,來(lái)從item確定classid,不能使用長(zhǎng)度來(lái)做鍵,可以使用key的NewHash結(jié)果等不定數(shù)據(jù),或者直接根據(jù)key來(lái)做hash(定長(zhǎng)數(shù)據(jù)的key也一定等長(zhǎng))。這里簡(jiǎn)單起見(jiàn),選擇第一種方法,這種方法的不足之處在于只使用一個(gè)id,在數(shù)據(jù)量非常大的情況下,slab鏈會(huì)很長(zhǎng)(因?yàn)樗袛?shù)據(jù)都擠在一條鏈上了),遍歷起來(lái)的代價(jià)比較高。前面介紹了三種空間冗余,設(shè)置chunk長(zhǎng)度等于item長(zhǎng)度,解決了第一種空間浪費(fèi)問(wèn)題,不預(yù)申請(qǐng)空間解決了第二種空間浪費(fèi)問(wèn)題,那么對(duì)于第一種問(wèn)題(slab內(nèi)剩余)如何解決呢,這就需要修改POWER_BLOCK常量,使得每一個(gè)slab大小正好等于chunk長(zhǎng)度的整數(shù)倍,這樣一個(gè)slab就可以正好劃分成n個(gè)chunk。這個(gè)數(shù)值應(yīng)該比較接近1MB,過(guò)大的話同樣會(huì)造成冗余,過(guò)小的話會(huì)造成次數(shù)過(guò)多的alloc,根據(jù)chunk長(zhǎng)度為200,選擇1000000作為POWER_BLOCK的值,這樣一個(gè)slab就是100萬(wàn)字節(jié),不是1048576。三個(gè)冗余問(wèn)題都解決了,空間利用率會(huì)大大提升。修改slabs_clsid函數(shù),讓它直接返回一個(gè)定值(比如1)unsignedintslabs_clsid(size_tsize)return1;修改slabs_init函數(shù),去掉循環(huán)創(chuàng)建所有classid屬性的部分,直接添加slabclass1:CODE:slabclass1.size=200;/每chunk200字節(jié)slabclass1.perslab=5000;/1000000/200,19,Memcache安裝、配置和使用:,Memcache安裝Memcache配置Memcache結(jié)合java客戶端的使用,20,Memcache安裝和使用:,Memcachewindows安裝,1.下載Memcache的window穩(wěn)定版,解壓到某個(gè)盤(pán)下面。2.Cmd找到解壓目錄,輸入memcached.exedinsatll安裝為windows服務(wù).(如果是win7,要以administrator方式啟動(dòng)cmd).3.再輸入memcached.exedstart啟動(dòng)。,21,Memcached安裝和使用:,Memcachedlinux安裝,安裝步驟:先安裝libevent再安裝Memcached主程序源碼下載:(最新版)libevent官網(wǎng):/provos/libevent/libevent下載:/provos/libevent-1.4.9-stable.tar.gzMemcached官網(wǎng):,22,Memcached安裝和使用:,Memcached安裝,安裝libevent#tarzxvflibevent-1.4.9-stable.tar.gz#cdlibevent-1.4.9-stable#./configure-prefix=/usr#make#makeinstall安裝Memcached#tarzxvfmemcached-1.2.6.tar.gz#cdmemcached-1.2.6#./configure-prefix=/usr/local#make#makeinstall,23,Memcached安裝和使用:,Memcached運(yùn)行,試運(yùn)行Memcached#/usr/local/bin/memcached-uhualiangxie,24,Memcached安裝和使用:,Memcached運(yùn)行,查看Memcached幫助信息#/usr/local/bin/memcached-h,25,Memcached安裝和使用:,Memcached運(yùn)行,關(guān)注基本選項(xiàng)-p監(jiān)聽(tīng)的TCP端口(缺省:11211)-d以守護(hù)進(jìn)程方式運(yùn)行Memcached-u運(yùn)行Memcached的賬戶,非root用戶-m最大的內(nèi)存使用,單位是MB,缺省是64MB-c軟連接數(shù)量,缺省是1024-v輸出警告和錯(cuò)誤信息-vv打印客戶端的請(qǐng)求和返回信息-h打印幫助信息-i打印memcached和libevent的版權(quán)信息運(yùn)行Memcached目標(biāo):使用11211端口、hualiangxie用戶、最大占用512M內(nèi)存、1024個(gè)軟連接,輸出客戶端請(qǐng)求,以守護(hù)進(jìn)程方式運(yùn)行#/usr/local/bin/memcached-p11211-d-uhualiangxie-m512-c1024-vvv,26,Memcached安裝和使用:,Memcached運(yùn)行,檢查是否正常啟動(dòng)#paauxxww|grepmemcached100144020.00.02296900pts/0S+19:240:00/usr/local/bin/memcached-uhualiangxieroot45470.00.01892668pts/3S+19:420:00grepmemcached#telnetlocalhost11211Trying.Connectedtolocalhost.Escapecharacteris.statsSTATpid4402STATuptime1032STATtime1231155683STATversion1.2.6STATpointer_size32.END,27,28,stats命令memcache的stats命令包括:1.stats2.statsreset清空統(tǒng)計(jì)信息3.statsmalloc顯示內(nèi)存分配數(shù)據(jù)4.statsmaps動(dòng)態(tài)庫(kù)的映射地址5.statssizes6.statsslabs7.statsitems8.statscachedumpslab_idlimit_num示某個(gè)slab中的前l(fā)imit_num個(gè)key列表9.statsdetailon|off|dump設(shè)置或顯示詳細(xì)操作信息,29,Memcached安裝和使用:,Memcached命令,數(shù)據(jù)存取setkey101803abcSTOREDaddkey101803xyzNOT_STOREDgetkey1VALUEkey103abcENDreplacekey101803xyzSTOREDgetkey1VALUEkey103xyzENDdeletekey1DELETED,數(shù)字加減setkey2018041234STOREDincrkey231237getkey2VALUEkey2041237ENDdecrkey211236getkey2VALUEkey2041236END,30,memcached的客戶端使用TCP鏈接與服務(wù)器通訊。(UDP接口也同樣有效)一個(gè)運(yùn)行中的memcached服務(wù)器監(jiān)視一些(可設(shè)置)端口。客戶端連接這些端口,發(fā)送命令到服務(wù)器,讀取回應(yīng),最后關(guān)閉連接。結(jié)束會(huì)話不需要發(fā)送任何命令。當(dāng)不再需memcached服務(wù)時(shí),要客戶端可以在任何時(shí)候關(guān)閉連接。需要注意的是,鼓勵(lì)客戶端緩存這些連接,而不是每次需要存取數(shù)據(jù)時(shí)都重新打開(kāi)連接。這是因?yàn)閙emcached被特意設(shè)計(jì)成及時(shí)開(kāi)啟很多連接也能夠高效的工作(數(shù)百個(gè),上千個(gè)如果需要的話)。緩存這些連接,可以消除建立連接所帶來(lái)的開(kāi)銷(xiāo)(/*/相對(duì)而言,在服務(wù)器端建立一個(gè)新連接的準(zhǔn)備工作所帶來(lái)的開(kāi)銷(xiāo),可以忽略不計(jì)。)。在memcache協(xié)議中發(fā)送的數(shù)據(jù)分兩種:文本行和自由數(shù)據(jù)。文本行被用于來(lái)自客戶端的命令和服務(wù)器的回應(yīng)。自由數(shù)據(jù)用于客戶端從服務(wù)器端存取數(shù)據(jù)時(shí)。同樣服務(wù)器會(huì)以字節(jié)流的方式傳回自由數(shù)據(jù)。/*/服務(wù)器不用關(guān)心自由數(shù)據(jù)的字節(jié)順序。自由數(shù)據(jù)的特征沒(méi)有任何限制;但是通過(guò)前文提到的文本行,這項(xiàng)數(shù)據(jù)的接受者(服務(wù)器或客戶端),便能夠精確地獲知所發(fā)送的數(shù)據(jù)庫(kù)的長(zhǎng)度。文本行固定以“rn”(回車(chē)符緊跟一個(gè)換行符)結(jié)束。自由數(shù)據(jù)也是同樣會(huì)以“rn”結(jié)束,但是r(回車(chē)符)、n(換行符),以及任何其他8位字符,均可出現(xiàn)在數(shù)據(jù)中。因此,當(dāng)客戶端從服務(wù)器取回?cái)?shù)據(jù)時(shí),必須使用數(shù)據(jù)區(qū)塊的長(zhǎng)度來(lái)確定數(shù)據(jù)區(qū)塊的結(jié)束位置,而不要依據(jù)數(shù)據(jù)區(qū)塊末尾的“rn”,即使它們固定存在于此,Memcached安裝和使用:,Memcached基本協(xié)議,31,Memcached安裝和使用:,Memcached和java結(jié)合使用,下載memcachedjavaclient:解壓后將java_memcached-release_2.0.1.jarjar包添加到工程的classpath中,/*Memcache服務(wù)器默認(rèn)端口是11211*/Stringservers=:11211;SockIOPoolpool=SockIOPool.getInstance();pool.setServers(servers);pool.setFailover(true);pool.setInitConn(10);pool.setMinConn(5);pool.setMaxConn(250);pool.setMaintSleep(30);pool.setNagle(false);pool.setSocketTO(3000);pool.setAliveCheck(true);pool.initialize();,MemCachedClientmemCachedClient=newMemCachedClient();for(inti=0;i10;i+)/*將對(duì)象加入到memcached緩存*/booleansuccess=memCachedClient.set(+i,Hello!);/*從memcached緩存中按key值取對(duì)象*/Stringresult=(String)memCachedClient.get(+i);System.out.println(String.format(set(%d):%s,i,success);System.out.println(String.format(get(%d):%s,i,result);,32,Memcache三種java客戶端的比較Memcacheclientforjava:較早推出的memcachejava客戶端API,應(yīng)用廣泛,運(yùn)行比較穩(wěn)定。spymemcached:Asimple,asynchronous,single-threadedmemcachedclientwritteninjava.支持異步,單線程的memcached客戶端,用到了java1.5版本的concurrent和nio,存取速度會(huì)高于前者,但是穩(wěn)定性不好,測(cè)試中常報(bào)timeOut等相關(guān)異常Xmemcached是基于javanio實(shí)現(xiàn)的高性能可擴(kuò)展的memcached客戶端。實(shí)際上是基于我實(shí)現(xiàn)的一個(gè)nio框架,Memcached安裝和使用:,33,Memcache在大型網(wǎng)站中的使用策略:,Memcache在大型網(wǎng)站中的部署策略基于memcached的slab和dump的內(nèi)存管理方式,它產(chǎn)生的內(nèi)存碎片比較少,不需要OS去做繁雜的內(nèi)存回收,所以它對(duì)CPU的占用率那是相當(dāng)?shù)牡?。所以建議將它跟占用CPU較高的WEB服務(wù)器一起使用來(lái)節(jié)省成本。當(dāng)然如果你有大量的廉價(jià)PC,那用來(lái)專(zhuān)門(mén)做memcached服務(wù)器也不錯(cuò)。由于32位操作系統(tǒng)中,每個(gè)進(jìn)程最多只能使用2GB內(nèi)存,所以如果你有大內(nèi)存的話,可以以daemon的方式啟動(dòng)兩個(gè)以上的memcached服務(wù),或者干脆用64位的CPU和OS。,34,Memcache緩存使用策略:,memcached主要的作用是為減輕大訪問(wèn)量對(duì)數(shù)據(jù)庫(kù)的沖擊,所以一般的邏輯是首先從memcached中讀取數(shù)據(jù),如果沒(méi)有就從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)寫(xiě)入到memcache中,等下一次讀取的時(shí)候就可以從memcached中讀取了。但在項(xiàng)目中的具體應(yīng)用策略(也就是哪些數(shù)據(jù)應(yīng)該緩存?怎么樣緩存?過(guò)期策略?)就是個(gè)問(wèn)題了。它的一個(gè)總原則是將經(jīng)常需要從數(shù)據(jù)庫(kù)讀取的數(shù)據(jù)緩存在memcached中。這些數(shù)據(jù)也分為幾類(lèi):一、經(jīng)常被讀取并且實(shí)時(shí)性要求不強(qiáng)可以等到自動(dòng)過(guò)期的數(shù)據(jù)。例如網(wǎng)站首頁(yè)最新文章列表、某某排行等數(shù)據(jù)。也就是雖然新數(shù)據(jù)產(chǎn)生了,但對(duì)用戶體驗(yàn)不會(huì)產(chǎn)生任何影響的場(chǎng)景。這類(lèi)數(shù)據(jù)就使用典型的緩存策略,設(shè)置一過(guò)合理的過(guò)期時(shí)間,當(dāng)數(shù)據(jù)過(guò)期以后再?gòu)臄?shù)據(jù)庫(kù)中讀取。當(dāng)然你得制定一個(gè)緩存清除策略,便于編輯或者其它人員能馬上看到效果。二、經(jīng)常被讀取并且實(shí)時(shí)性要求強(qiáng)的數(shù)據(jù)。比如用戶的好友列表,用戶文章列表,用戶閱讀記錄等。這類(lèi)數(shù)據(jù)首先被載入到memcached中,當(dāng)發(fā)生更改(添加、修改、刪除)時(shí)就清除緩存。在緩存的時(shí)候,我將查詢(xún)的SQL語(yǔ)句md5()得到它的hash值作為key,結(jié)果數(shù)組作為值寫(xiě)入memcached,并且將該SQL涉及的table_name以及hash值配對(duì)存入memcached中。當(dāng)更改了這個(gè)表時(shí),我就將與此表相配對(duì)的key的緩存全部刪除。,35,Memcache緩存使用策略:,三、統(tǒng)計(jì)類(lèi)緩存,比如文章瀏覽數(shù)、網(wǎng)站PV等此類(lèi)緩存是將在數(shù)據(jù)庫(kù)的中來(lái)累加的數(shù)據(jù)放在memcached來(lái)累加。獲取也通過(guò)memcached來(lái)獲取。但這樣就產(chǎn)生了一個(gè)問(wèn)題,如果memcached服務(wù)器down掉的話這些數(shù)據(jù)就有可能丟失,所以一般使用memcached的永固性存儲(chǔ),這方面我們新浪使用memcachedb。四、活躍用戶的基本信息或者某篇熱門(mén)文章。此類(lèi)數(shù)據(jù)的一個(gè)特點(diǎn)就是數(shù)據(jù)都是一行,也就是一個(gè)一維數(shù)組,當(dāng)數(shù)據(jù)被update時(shí)(比如修改昵稱(chēng)、文章的評(píng)論數(shù)),在更改數(shù)據(jù)庫(kù)數(shù)據(jù)的同時(shí),使用Memcache:replace替換掉緩存里的數(shù)據(jù)。這樣就有效了避免了再次查詢(xún)數(shù)據(jù)庫(kù)。五、session數(shù)據(jù)使用memcached來(lái)存儲(chǔ)session的效率是最高的。memcached本身也是非常穩(wěn)定的,不太用擔(dān)心它會(huì)突然down掉引起session數(shù)據(jù)的丟失,即使丟失就重新登錄了,也沒(méi)啥。見(jiàn)多服務(wù)器session共享之memcache共享,36,一些經(jīng)驗(yàn)和技巧:,Memcached一些特性和限制,在Memcached中可以保存的item數(shù)據(jù)量是沒(méi)有限制的,只有內(nèi)存足夠Memcached單進(jìn)程最大使用內(nèi)存為2G,要使用更多內(nèi)存,可以分多個(gè)端口開(kāi)啟多個(gè)Memcached進(jìn)程最大30天的數(shù)據(jù)過(guò)期時(shí)間,設(shè)置為永久的也會(huì)在這個(gè)時(shí)間過(guò)期,常量REALTIME_MAXDELTA60*60*24*30控制最大鍵長(zhǎng)為250字節(jié),大于該長(zhǎng)度無(wú)法存儲(chǔ),常量KEY_MAX_LENGTH250控制,客戶端可以加上自己的前綴,所以最大長(zhǎng)度是可以超過(guò)50的。單個(gè)item最大數(shù)據(jù)是1MB,超過(guò)1MB數(shù)據(jù)不予存儲(chǔ),常量POWER_BLOCK1048576進(jìn)行控制,它是默認(rèn)的slab大小最大同時(shí)連接數(shù)是200,通過(guò)conn_init()中的freetotal進(jìn)行控制,最大軟連接數(shù)是1024,通過(guò)settings.maxconns=1024進(jìn)行控制,這跟操作系統(tǒng)有關(guān),linux好像最大就是200。跟空間占用相關(guān)的參數(shù):settings.factor=1.25,settings.chunk_size=48,影響slab的數(shù)據(jù)占用和步進(jìn)方式,37,一些經(jīng)驗(yàn)和技巧:,查看Memcached內(nèi)部工作狀態(tài),訪問(wèn)Memcached:telnet主機(jī)名端口號(hào)查看總狀態(tài):stats查看某項(xiàng)狀態(tài):statscurr_connections,禁止LRU,有些情況下LRU機(jī)制反倒會(huì)造成麻煩。memcached啟動(dòng)時(shí)通過(guò)“-M”參數(shù)可以禁止LRU,如下所示:$memcached-M-m1024啟動(dòng)時(shí)必須注意的是,小寫(xiě)的“-m”選項(xiàng)是用來(lái)指定最大內(nèi)存大小的。不指定具體數(shù)值則使用默認(rèn)值64MB。指定“-M”參數(shù)啟動(dòng)后,內(nèi)存用盡時(shí)memcached會(huì)返回錯(cuò)誤。話說(shuō)回來(lái),memcached畢竟不是存儲(chǔ)器,而是緩存,所以推薦使用LRU。,38,一些經(jīng)驗(yàn)和技巧:,Memcached使用線程模式工作,在安裝的時(shí)候必須打開(kāi):./configure-enable-threads安裝完之后,啟動(dòng)的時(shí)候看看幫助信息有沒(méi)有這條:-tnumberofthreadstouse,default4如果存在該選項(xiàng),說(shuō)明已經(jīng)支持了線程,就可以在啟動(dòng)的時(shí)候使用-t選項(xiàng)來(lái)啟動(dòng)多線程然后啟動(dòng)的時(shí)候必須加上你需要支持的線程數(shù)量:/usr/local/memcache/bin/memcached-t1024,39,一些經(jīng)驗(yàn)和技巧:,調(diào)優(yōu)Slab和內(nèi)存分配1,memcached在啟動(dòng)時(shí)指定GrowthFactor因子(通過(guò)-f選項(xiàng)),就可以在某種程度上控制slab之間的差異。默認(rèn)值為1.25。但是,在該選項(xiàng)出現(xiàn)之前,這個(gè)因子曾經(jīng)固定為2,稱(chēng)為“powersof2”策略。讓我們用以前的設(shè)置,以verbose模式啟動(dòng)memcached試試看:$memcached-f2-vvslabclass1:chunksize128perslab8192slabclass2:chunksize256perslab4096slabclass3:chunksize512perslab2048slabclass4:chunksize1024perslab1024slabclass5:chunksize2048perslab512slabclass6:chunksize4096perslab256slabclass7:ch

溫馨提示

  • 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)論