posts - 262,  comments - 221,  trackbacks - 0

          【1】Memcached是使用基于Key-value值對形式的內存緩沖,它不是使用磁盤緩沖來充當緩沖,而是使用實實在在的物理內存。

          【2】Memcached需要在啟動時就指定分配的內存大小。命令如:memcached -d -m 內存大小(M為單位) -l IP地址 -p 端口

          【3】Memcached是一種單索引的結構化數據組織形式,所有數據項之間彼此獨立(不想傳統的數據是關系型的),每個數據項都以key為唯一索引,不要以關系型的思維來對待緩存

          【4】Memcached使用基于key的hash算法來存儲數據,查詢的時間復雜度達到O(1)

          【5】Memcached使用LRU算法來淘汰緩沖數據項,但同時允許使用者設定緩存過期時間,這個時間需要根據測試而定

          【6】Memcached使用libevent函數庫來實現網絡并發模型,支持較大并發用戶數環境下的緩存操作

          【7】Memcached使用對象序列化技術,可以把對象序列化成二進制數據,在網絡中傳輸

          【8】Memcached可以和JSON格式結合,把內存中對象以JSON形式表示,然后序列化為字符串后緩存起來

          【9】Memcached的客戶端API可以支持直接把對象保存到緩存中,也可以直接從緩存中取出對象,隱藏了轉換的細節

          【10】使用Memcached的一個核心問題就是:什么內容是可以緩存的?什么是沒有必要實時發生的

          【11】不要在Memcached上使用鎖來防止線程競爭,而是使用其提供的原子遞增操作

          【12】Memcached的狀態參數中:total_items、bytes、get_hits、bytes_read、bytes_written、limit_maxBytes都是很常用的參考數據

          【13】Memcached的狀態中,要關注的有空間使用率、緩存命中率、IO流量

          【14】Memcached的緩存數據分區,最好不要基于業務數據內容種類,而是采用和業務無關的分區算法,否則容易造成負載不平衡

          【15】Memcached擴展后,需要在前端通過一個“緩存連接器”來根據散列算法分配緩存數據

          【16】Memcached的數據理論上都來自于底層的持久化資源,所以當緩存擴展后,可以清除它。前提是必要的數據已經持久化了

          【17】緩存不是持久化設施,不要用持久化的理念去對待緩存中的數據。它本來就已經存在對應的持久化資源了

          【18】緩存中的數據最好是臨時性數據(無必要持久化,而只是作為流程控制用)或者已經有對應的持久化資源存在的(必要時可以重建)

          【19】Memcached采用的是“塊分配”的內存分配模式,同時對key的限制是250字節,對value的限制是1M大小

          【20】Memcached采用是偷懶替代法,不會開額外的進程來實時監測過時的kv對并刪除,而是當且僅當,新來一個插入的數據,而此時又沒有多余的空間放了,才會進行清除動作。

          【21】一旦數據庫的數據發現變化,我們一定要及時更新cache中的數據,來保證app讀到的是同步的正確數據。當然我們可以通過定時器方式記錄下cache中數據的失效時間,時間一過就會激發事件對cache進行更新,但這之間總會有時間上的延遲,導致app可能從cache讀到臟數據,這也被稱為狗洞問題。

          【22】當一個ms上丟失了數據之后,app還是可以從數據庫中取得數據。不過更謹慎的做法是在某些ms不能正常工作時,提供額外的ms來支持cache,這樣就不會因為app從cache中取不到數據而一下子給數據庫帶來過大的負載。

          【23】有了緩存的支持,我們可以在傳統的app層和db層之間加入cache層,每個app服務器都可以綁定一個mc,每次數據的讀取都可以從ms中取得,如果沒有,再從db層讀取。而當數據要進行更新時,除了要發送update的sql給db層,同時也要將更新的數據發給mc,讓mc去更新ms中的數據。

          【24】為了最小化數據庫的負載壓力,我們可以部署數據庫復寫,用slave數據庫來完成讀取操作,而master數據庫永遠只負責三件事:1.更新數據;2.同步slave數據庫;3.更新cache。

          【25】因為現在key是散列在不同的server上的,所以對某類key進行大批量清理是很麻煩的。因為memcached本身是一個大hash表,是不具備key的檢索功能的。所以memcached是壓根不知道某一類的key到底存了多少個,都存在哪些server上。而這類功能在實際應用中卻是經常用到。

           



          -------------------------------------------------------------
          生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
          posted on 2010-03-15 10:57 Paul Lin 閱讀(2280) 評論(0)  編輯  收藏 所屬分類: J2EE基礎
          <2010年3月>
          28123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 二连浩特市| 静海县| 阳东县| 望奎县| 龙里县| 双城市| 德阳市| 渭南市| 东明县| 泰和县| 斗六市| 桑日县| 嘉兴市| 三台县| 光山县| 温宿县| 侯马市| 九江市| 邵阳县| 海丰县| 丘北县| 米林县| 双牌县| 乐山市| 磐安县| 金寨县| 茂名市| 雷波县| 鄂州市| 金溪县| 乐安县| 个旧市| 呼玛县| 峨眉山市| 罗定市| 右玉县| 会理县| 太谷县| 荆州市| 天峻县| 呼伦贝尔市|