【1】Memcached是使用基于Key-value值對形式的內(nèi)存緩沖,它不是使用磁盤緩沖來充當(dāng)緩沖,而是使用實實在在的物理內(nèi)存。
【2】Memcached需要在啟動時就指定分配的內(nèi)存大小。命令如:memcached -d -m 內(nèi)存大小(M為單位) -l IP地址 -p 端口
【3】Memcached是一種單索引的結(jié)構(gòu)化數(shù)據(jù)組織形式,所有數(shù)據(jù)項之間彼此獨立(不想傳統(tǒng)的數(shù)據(jù)是關(guān)系型的),每個數(shù)據(jù)項都以key為唯一索引,不要以關(guān)系型的思維來對待緩存
【4】Memcached使用基于key的hash算法來存儲數(shù)據(jù),查詢的時間復(fù)雜度達到O(1)
【5】Memcached使用LRU算法來淘汰緩沖數(shù)據(jù)項,但同時允許使用者設(shè)定緩存過期時間,這個時間需要根據(jù)測試而定
【6】Memcached使用libevent函數(shù)庫來實現(xiàn)網(wǎng)絡(luò)并發(fā)模型,支持較大并發(fā)用戶數(shù)環(huán)境下的緩存操作
【7】Memcached使用對象序列化技術(shù),可以把對象序列化成二進制數(shù)據(jù),在網(wǎng)絡(luò)中傳輸
【8】Memcached可以和JSON格式結(jié)合,把內(nèi)存中對象以JSON形式表示,然后序列化為字符串后緩存起來
【9】Memcached的客戶端API可以支持直接把對象保存到緩存中,也可以直接從緩存中取出對象,隱藏了轉(zhuǎn)換的細節(jié)
【10】使用Memcached的一個核心問題就是:什么內(nèi)容是可以緩存的?什么是沒有必要實時發(fā)生的
【11】不要在Memcached上使用鎖來防止線程競爭,而是使用其提供的原子遞增操作
【12】Memcached的狀態(tài)參數(shù)中:total_items、bytes、get_hits、bytes_read、bytes_written、limit_maxBytes都是很常用的參考數(shù)據(jù)
【13】Memcached的狀態(tài)中,要關(guān)注的有空間使用率、緩存命中率、IO流量
【14】Memcached的緩存數(shù)據(jù)分區(qū),最好不要基于業(yè)務(wù)數(shù)據(jù)內(nèi)容種類,而是采用和業(yè)務(wù)無關(guān)的分區(qū)算法,否則容易造成負載不平衡
【15】Memcached擴展后,需要在前端通過一個“緩存連接器”來根據(jù)散列算法分配緩存數(shù)據(jù)
【16】Memcached的數(shù)據(jù)理論上都來自于底層的持久化資源,所以當(dāng)緩存擴展后,可以清除它。前提是必要的數(shù)據(jù)已經(jīng)持久化了
【17】緩存不是持久化設(shè)施,不要用持久化的理念去對待緩存中的數(shù)據(jù)。它本來就已經(jīng)存在對應(yīng)的持久化資源了
【18】緩存中的數(shù)據(jù)最好是臨時性數(shù)據(jù)(無必要持久化,而只是作為流程控制用)或者已經(jīng)有對應(yīng)的持久化資源存在的(必要時可以重建)
【19】Memcached采用的是“塊分配”的內(nèi)存分配模式,同時對key的限制是250字節(jié),對value的限制是1M大小
【20】Memcached采用是偷懶替代法,不會開額外的進程來實時監(jiān)測過時的kv對并刪除,而是當(dāng)且僅當(dāng),新來一個插入的數(shù)據(jù),而此時又沒有多余的空間放了,才會進行清除動作。
【21】一旦數(shù)據(jù)庫的數(shù)據(jù)發(fā)現(xiàn)變化,我們一定要及時更新cache中的數(shù)據(jù),來保證app讀到的是同步的正確數(shù)據(jù)。當(dāng)然我們可以通過定時器方式記錄下cache中數(shù)據(jù)的失效時間,時間一過就會激發(fā)事件對cache進行更新,但這之間總會有時間上的延遲,導(dǎo)致app可能從cache讀到臟數(shù)據(jù),這也被稱為狗洞問題。
【22】當(dāng)一個ms上丟失了數(shù)據(jù)之后,app還是可以從數(shù)據(jù)庫中取得數(shù)據(jù)。不過更謹慎的做法是在某些ms不能正常工作時,提供額外的ms來支持cache,這樣就不會因為app從cache中取不到數(shù)據(jù)而一下子給數(shù)據(jù)庫帶來過大的負載。
【23】有了緩存的支持,我們可以在傳統(tǒng)的app層和db層之間加入cache層,每個app服務(wù)器都可以綁定一個mc,每次數(shù)據(jù)的讀取都可以從ms中取得,如果沒有,再從db層讀取。而當(dāng)數(shù)據(jù)要進行更新時,除了要發(fā)送update的sql給db層,同時也要將更新的數(shù)據(jù)發(fā)給mc,讓mc去更新ms中的數(shù)據(jù)。
【24】為了最小化數(shù)據(jù)庫的負載壓力,我們可以部署數(shù)據(jù)庫復(fù)寫,用slave數(shù)據(jù)庫來完成讀取操作,而master數(shù)據(jù)庫永遠只負責(zé)三件事:1.更新數(shù)據(jù);2.同步slave數(shù)據(jù)庫;3.更新cache。
【25】因為現(xiàn)在key是散列在不同的server上的,所以對某類key進行大批量清理是很麻煩的。因為memcached本身是一個大hash表,是不具備key的檢索功能的。所以memcached是壓根不知道某一類的key到底存了多少個,都存在哪些server上。而這類功能在實際應(yīng)用中卻是經(jīng)常用到。
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
posted on 2010-03-15 10:57
Paul Lin 閱讀(2270)
評論(0) 編輯 收藏 所屬分類:
J2EE基礎(chǔ)