Memcache原理分析

2021-07-30 12:02:35 字數 1900 閱讀 2539

** :

memcached是高效能的分布式記憶體快取伺服器。一般的使用目的是,通過快取資料庫查詢結果,減少資料庫訪問次數,以提高動態web應用的速度、提高可擴充套件性。 

memcached使用libevent庫實現網路連線服務,理論上可以處理無限多的連線,但是它和apache不同,它更多的時候是面向穩定的持續連線的,所以它實際的併發能力是有限制的。在保守情況下memcached的最大同時連線數為200,這和linux執行緒能力有關係,這個數值是可以調整的。關於libevent可以參考相關文件。 memcached記憶體使用方式也和apc不同。apc是基於共享記憶體和mmap的,memcachd有自己的記憶體分配演算法和管理方式,它和共享記憶體沒有關係,也沒有共享記憶體的限制,通常情況下,每個memcached程序可以管理2gb的記憶體空間,如果需要更多的空間,可以增加程序數。 

memcached適合什麼場合?在很多時候,memcached被濫用了,它不適用所有場合。memcached是 「分布式」的記憶體物件快取系統。因此,那些不需要「分布」的,不需要共享的,或者乾脆規模小到只有一台伺服器的應用,使用memcached根本不會帶來任何好處,相反還會拖慢系統效率,因為網路連線同樣需要資源,即使是unix本地連線也一樣。在我之前的測試資料中顯示,memcached本地讀寫速度要比直接php記憶體陣列慢幾十倍,而apc、共享記憶體方式都和直接陣列差不多。可見,如果只是本地級快取,使用memcached是非常不划算的。 

memcached深度分析 

memcached用途: 

(一)memcached在很多時候都是作為資料庫前端cache使用的。因為它比資料庫少了很多sql解析、磁碟操作等開銷,而且它是使用記憶體來管理資料的,所以它可以提供比直接讀取資料庫更好的效能,在大型系統中,訪問同樣的資料是很頻繁的,memcached可以大大降低資料庫壓力,使系統執行效率提公升。 

memcached注意事項: 

(一)memcached使用記憶體管理資料,所以它是易失的,當伺服器重啟,或者memcached程序中止,資料便會丟失,所以memcached不能用來持久儲存資料。 

(二)memcached的實際瓶頸在於網路連線。很多人的錯誤理解,memcached的效能非常好,好到了記憶體和硬碟的對比程度,其實 memcached使用記憶體並不會得到成百上千的讀寫速度提高,因為他的瓶頸在於網路連線。它和使用磁碟的資料庫系統相比,好處在於它本身非常「輕」,因為沒有過多的開銷和直接的讀寫方式,它可以輕鬆應付非常大的資料交換量,所以經常會出現兩條千兆網路頻寬都滿負荷了,memcached程序本身並不占用多少cpu資源的情況。 

(三)memcached之間不互相通訊。 

(四)memcached缺乏認證以及安全管制,所以memcached伺服器應該放置在防火牆後。 

範例 將純粹使用資料庫查詢的程式碼加上memcached支援是很簡單的,假設這是原來的程式碼: 

//最原始的方法,直接從資料庫獲取資料 

function get_foo (int userid)  

return result; 

上述的程式會先到memcached檢查是否有userrow:userid的資料,如果有則直接傳回結果,如果不存在時再去資料庫查詢,並將結果放到memcached內。 

有乙個問題,如果在memcached內已經有快取資料時,而資料庫的資料被更新後,上述的程式會抓到舊的資料,這是屬於cache coherency的問題。其中一種解決的方法是在更新資料庫時,同時更新memcached內的資料: 

//資料庫更新資料的方法 

function update_foo(int userid, string dbupdatestring)  

memcache 內部原理實現

lazy expiration memcached 內部不會監視記錄是否過期,而是在 get 時檢視記錄的時間戳,檢查記錄是否過期。這 種技術被稱為 lazy 惰性 expiration。因此,memcached 不會在過期監視上耗費 cpu 時間。lru least recently used 最...

Memcache使用例項及分析

綜合使用例項 複製 如下 連線 mem new memcache mem connect db.nowamagic.net 12000 儲存資料 mem set key1 this is first value 0,60 val mem get key1 echo get key1 value va...

memcache 記憶體機制與快取原理

如果用 c 語言直接 malloc,free 來向作業系統申請和釋放記憶體時,在不斷的申請和釋放過程中,形成了一些很小的記憶體片斷,無法再利用.這種空閒,但無法利用記憶體的現象,稱為記憶體的碎片化.memcached 用 slab allocator 機制來管理記憶體.slab allocator ...