|
緣起: 在數(shù)據(jù)驅(qū)動的web開發(fā)中,經(jīng)常要重復(fù)從數(shù)據(jù)庫中取出相同的數(shù)據(jù),這種重復(fù)極大的增加了數(shù)據(jù)庫負(fù)載。緩存是解決這個問題的好辦法。但是ASP.NET中的雖然已經(jīng)可以實現(xiàn)對頁面局部進(jìn)行緩存,但還是不夠靈活。此時Memcached或許是你想要的。
Memcached是什么?
Memcached是由Danga Interactive開發(fā)的,高性能的,分布式的內(nèi)存對象緩存系統(tǒng),用于在動態(tài)應(yīng)用中減少數(shù)據(jù)庫負(fù)載,提升訪問速度。
Memcached能緩存什么?
通過在內(nèi)存里維護(hù)一個統(tǒng)一的巨大的hash表,Memcached能夠用來存儲各種格式的數(shù)據(jù),包括圖像、視頻、文件以及數(shù)據(jù)庫檢索的結(jié)果等。
Memcached快么?
非常快。Memcached使用了libevent(如果可以的話,在linux下使用epoll)來均衡任何數(shù)量的打開鏈接,使用非阻塞的網(wǎng)絡(luò)I/O,對內(nèi)部對象實現(xiàn)引用計數(shù)(因此,針對多樣的客戶端,對象可以處在多樣的狀態(tài)), 使用自己的頁塊分配器和哈希表, 因此虛擬內(nèi)存不會產(chǎn)生碎片并且虛擬內(nèi)存分配的時間復(fù)雜度可以保證為O(1).。
Danga Interactive為提升Danga Interactive的速度研發(fā)了Memcached。目前,LiveJournal.com每天已經(jīng)在向一百萬用戶提供多達(dá)兩千萬次的頁面訪問。而這些,是由一個由web服務(wù)器和數(shù)據(jù)庫服務(wù)器組成的集群完成的。Memcached幾乎完全放棄了任何數(shù)據(jù)都從數(shù)據(jù)庫讀取的方式,同時,它還縮短了用戶查看頁面的速度、更好的資源分配方式,以及Memcache失效時對數(shù)據(jù)庫的訪問速度。
Memcached的特點
Memcached的緩存是一種分布式的,可以讓不同主機(jī)上的多個用戶同時訪問, 因此解決了共享內(nèi)存只能單機(jī)應(yīng)用的局限,更不會出現(xiàn)使用數(shù)據(jù)庫做類似事情的時候,磁盤開銷和阻塞的發(fā)生。
Memcached的使用
一 Memcached服務(wù)器端的安裝 (此處將其作為系統(tǒng)服務(wù)安裝)
下載文件: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 ,默認(rèn)監(jiān)聽端口為 11211
通過 memcached.exe -h 可以查看其幫助
二 .NET memcached client library
下載文件:https://sourceforge.NET/projects/memcacheddotNET/
里面有.NET1.1 和 .NET2.0的兩種版本 還有一個不錯的例子。
三 應(yīng)用
1 將Commons.dll,ICSharpCode.SharpZipLib.dll,log4NET.dll,Memcached.ClientLibrary.dll 等放到bin目錄 NET技術(shù):分布式緩存系統(tǒng)Memcached簡介與實踐,轉(zhuǎn)載需保留來源! 鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。
2 引用Memcached.ClientLibrary.dll
3 代碼
1 namespace Memcached.MemcachedBench
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"); //存儲數(shù)據(jù)到緩存服務(wù)器,這里將字符串"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(); //關(guān)閉池, 關(guān)閉sockets
65 }
66 }
67 }