.net/c#分佈式緩存系統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:/memcached/memcached.exe -d install'
3 命令行輸入 'c:/memcached/memcached.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 代碼
2 {
3 using System;
4 using System.Collections;
5
6 using Memcached.ClientLibrary;
7
8 public class MemcachedBench
9 {
10 [STAThread]
11 public static void Main(String[] args)
12 {
13 string [] serverlist = { " 10.0.0.131:11211 " , " 10.0.0.132:11211 " };
14
15 // 初始化池
16 SockIOPool pool = SockIOPool.GetInstance();
17 pool.SetServers(serverlist);
18
19 pool.InitConnections = 3 ;
20 pool.MinConnections = 3 ;
21 pool.MaxConnections = 5 ;
22
23 pool.SocketConnectTimeout = 1000 ;
24 pool.SocketTimeout = 3000 ;
25
26 pool.MaintenanceSleep = 30 ;
27 pool.Failover = true ;
28
29 pool.Nagle = false ;
30 pool.Initialize();
31
32 // 獲得客戶端實例
33 MemcachedClient mc = new MemcachedClient();
34 mc.EnableCompression = false ;
35
36 Console.WriteLine( " ------------測 試----------- " );
37 mc.Set( " test " , " my value " ); // 存儲數據到緩存服務器,這裏將字符串"my value"緩存,key 是"test"
38
39 if (mc.KeyExists( " test " )) // 測試緩存存在key爲test的項目
40 {
41 Console.WriteLine( " test is Exists " );
42 Console.WriteLine(mc.Get( " test " ).ToString()); // 在緩存中獲取key爲test的項目
43 }
44 else
45 {
46 Console.WriteLine( " test not Exists " );
47 }
48
49 Console.ReadLine();
50
51 mc.Delete( " test " ); // 移除緩存中key爲test的項目
52
53 if (mc.KeyExists( " test " ))
54 {
55 Console.WriteLine( " test is Exists " );
56 Console.WriteLine(mc.Get( " test " ).ToString());
57 }
58 else
59 {
60 Console.WriteLine( " test not Exists " );
61 }
62 Console.ReadLine();
63
64 SockIOPool.GetInstance().Shutdown(); // 關閉池, 關閉sockets
65 }
66 }
67 }