分散式緩存系統Memcached簡介與實踐

分散式緩存系統Memcached簡介與實踐

緣起: 在數據驅動的web開發中,經常要重複從資料庫中取出相同的數據,這種重複極大的增加了資料庫負載。緩存是解決這個問題的好辦法。但是ASP.NET中的雖然已經可以實現對頁面局部進行緩存,但還是不夠靈活。此時Memcached或許是你想要的。Memcached是什麼?Memcached是由Danga Interactive開發的,高性能的,分散式的內存對象緩存系統,用於在動態應用中減少資料庫負載,提升訪問速度。Memcached能緩存什麼?通過在內存里維護一個統一的巨大的hash表,Memcached能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及資料庫檢索的結果等。Memcached快么?非常快。Memcached使用了libevent(如果可以的話,在linux下使用epoll)來均衡任何數量的打開鏈接,使用非阻塞的網路I/O,對內部對象實現引用計數(因此,針對多樣的客戶端,對象可以處在多樣的狀態), 使用自己的頁塊分配器和哈希表, 因此虛擬內存不會產生碎片並且虛擬內存分配的時間複雜度可以保證為O(1).。Danga Interactive為提升Danga Interactive的速度研發了Memcached。目前,LiveJournal.com每天已經在向一百萬用戶提供多達兩千萬次的頁面訪問。而這些,是由一個由web伺服器和資料庫伺服器組成的集群完成的。Memcached幾乎完全放棄了任何數據都從資料庫讀取的方式,同時,它還縮短了用戶查看頁面的速度、更好的資源分配方式,以及Memcache失效時對資料庫的訪問速度。Memcached的特點Memcached的緩存是一種分散式的,可以讓不同主機上的多個用戶同時訪問, 因此解決了共享內存只能單機應用的局限,更不會出現使用資料庫做類似事情的時候,磁碟開銷和阻塞的發生。Memcached的使用 一 Memcached伺服器端的安裝 (此處將其作為系統服務安裝) 下載文件:memcached 1.2.1 for Win32 binaries (Dec 23, 2006)1 解壓縮文件到c:memcached 2命令行輸入 『c:memcachedmemcached.exe -d install『3 命令行輸入 『c:memcachedmemcached.exe -d start『,該命令啟動 Memcached ,默認監聽埠為 11211 通過 memcached.exe -h 可以查看其幫助二 .NET memcached client library 下載文件:https://sourceforge.net/projects/memcacheddotnet/

裡面有.net1.1 和 .net2.0的兩種版本 還有一個不錯的例子。

三 應用

1 將Commons.dll,ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll 等放到bin目錄 2 引用Memcached.ClientLibrary.dll 3 代碼

1namespaceMemcached.MemcachedBench2{3usingSystem;4usingSystem.Collections;56usingMemcached.ClientLibrary;78publicclassMemcachedBench9{10[STAThread]11publicstaticvoidMain(String[]args)12{13string[]serverlist={"10.0.0.131:11211","10.0.0.132:11211"};1415//初始化池16SockIOPoolpool=SockIOPool.GetInstance();17pool.SetServers(serverlist);1819pool.InitConnections=3;20pool.MinConnections=3;21pool.MaxConnections=5;2223pool.SocketConnectTimeout=1000;24pool.SocketTimeout=3000;2526pool.MaintenanceSleep=30;27pool.Failover=true;2829pool.Nagle=false;30pool.Initialize();3132//獲得客戶端實例33MemcachedClientmc=newMemcachedClient();34mc.EnableCompression=false;3536Console.WriteLine("------------測試-----------");37mc.Set("test","myvalue");//存儲數據到緩存伺服器,這裡將字元串"myvalue"緩存,key是"test"3839if(mc.KeyExists("test"))//測試緩存存在key為test的項目40{41Console.WriteLine("testisExists");42Console.WriteLine(mc.Get("test").ToString());//在緩存中獲取key為test的項目43}44else45{46Console.WriteLine("testnotExists");47}4849Console.ReadLine();5051mc.Delete("test");//移除緩存中key為test的項目5253if(mc.KeyExists("test"))54{55Console.WriteLine("testisExists");56Console.WriteLine(mc.Get("test").ToString());57}58else59{60Console.WriteLine("testnotExists");61}62Console.ReadLine();6364SockIOPool.GetInstance().Shutdown();//關閉池,關閉sockets65}66}67} 4 運行結果

後記: 是個不錯的東西 ,使用起來也很方便,php ,ruby 的項目中用這個的很多,但是.net項目中用的較少(恕俺孤陋寡聞) 。希望有興趣的朋友們 多多交流 。 看到頁首了么各位兄弟? 不用我多說了吧,揮動您的滑鼠 輕輕按下左鍵吧


推薦閱讀:

系統神學 章力生 卷七 教會論 (4)
日產轎車發動機防盜系統設定
The Master Key System 24週財富金鑰系統Week 9
攝影師必備基礎 超系統詳解色彩理論(下)
免疫系統是腫瘤的重要防線   錢江晚報

TAG:分散式 | 系統 | 實踐 | 緩存 | Memcached | 簡介 |