C# memcache 應用引見。本站提示廣大學習愛好者:(C# memcache 應用引見)文章只能為提供參考,不一定能成為您想要的結果。以下是C# memcache 應用引見正文
概述
memcache是一套開放源的散布式高速緩存體系。由辦事端和客戶端構成,以守護法式(監聽)方法運轉於一個或多個辦事器中,隨時會吸收客戶真個銜接和操作。memcache重要把數據對象緩存到內存中,經由過程在內存裡保護一個同一的偉大的hash表。簡略的說就是將數據挪用到內存中,然後從內存中讀取,從而年夜年夜進步讀取速度。memcache基於一個存儲鍵/值對的hashmap停止存儲對象到內存中。memcache是用C寫的,然則客戶端可以用任何說話來編寫,並經由過程memcached協定與守護過程通訊。
特征:
•在 Memcached中可以保留的item數據量是沒無限制的,只需內存足夠 。
•Memcached單過程在32位體系中最年夜應用內存為2G,若在64位體系則沒無限制,這是因為32位體系限制單過程最多可以使用2G內存,要應用更多內存,可以分多個端口開啟多個Memcached過程 。
•最年夜30天的數據過時時光,設置為永遠的也會在這個時光過時,常量REALTIME_MAXDELTA
•單個item最年夜數據是1MB,跨越1MB數據不予存儲,常量POWER_BLOCK 1048576停止掌握
Windows下裝置Memcache
懂得memcache一些根本信息後,在來測驗考試在windows下裝置memcache辦事端。
1.起首下載memcache裝置文件:【裝置包】。裝置包外面會有x64和x86兩個文件夾,依據操作體系選擇一個翻開會找到memcached.exe。這個文件不克不及直接雙擊運轉裝置,須要經由過程cmd停止裝置。
2.裝置步調如圖所示:
步調:
1.窗口+R:輸出cmd
2.停止G盤: 輸出 G:
3.停止Memcached for window 32/64的裝置目次:輸出 cd CK\memcached_en32or64\x64
4.裝置memcached:輸出 memcached -d install
5.啟動辦事:輸出 memcached -d start
啟動辦事後在Windows過程中可以看到memcached.exe.
memcached -d start|stop|shutdown|restart|uninstall|install 啟動|停滯|封閉|重啟|卸載|裝置。
裝置步調不是很龐雜。第一:找到文件(memcached.exe)途徑。第二: memcached -d install 就OK..
根本默許參數解釋:
-p 監聽的端口
-l 銜接的IP地址, 默許是本機
-d start 啟動memcached辦事
-d restart 重起memcached辦事
-d stop|shutdown 封閉正在運轉的memcached辦事
-d install 裝置memcached辦事
-d uninstall 卸載memcached辦事
-u 以的身份運轉 (僅在以root運轉的時刻有用)
-m 最年夜內存應用,單元MB。默許64MB
-M 內存耗盡時前往毛病,而不是刪除項
-c 最年夜同時銜接數,默許是1024
-f 塊年夜小增加因子,默許是1.25
-n 最小分派空間,key+value+flags默許是48
-h 顯示贊助
辦事器操作完成後,我們可以在本機telnet 到辦事測試一個下。(假如提醒telnet敕令不存在,須要去控件面板開啟windows的tel辦事功效, win7的開啟tel功效操作步調是:【掌握面板】->【法式和功效】->【翻開或封閉window功效】,然後找到並勾選tel相干便可。其他window體系步調相似。)
測試telnet能否正常運轉 telnet 172.21.0.192 11211
進入後先按ctrl+]啟動回示功效,不然沒法看到輸出信息。回示功效啟動勝利後以下圖:
然後按回車輸出參數stats:
裝置和測試任務已完成..
實例代碼
有許多C#版本的Memcached客戶端法式。在這裡我們應用的是Memcached.ClientLibrary.dll客戶端挪用辦法,挪用須要二個DLL:
Memcached.ClientLibrary.dll (Memcached客戶端類庫)
log4net.dll (log4net是為Memcached供給日記記載) DLL下載地址:【點擊下載】
在項目中援用這個二個dll,援用log4net.dll後還需停止一系列設置裝備擺設任務。在上篇博客中有對log4net的設置裝備擺設引見。
【Log4Net 日記設置裝備擺設[附帶源碼]】
留意:Memcached.ClientLibrary.dll和log4net.dll有版本對應關系。
2.假如應用WinForm或掌握台運用法式把log4net的設置裝備擺設文件自力湧現,和寫在App.config外面須要小小設置一下。
如圖:Log4Net.config屬性“復制到輸入目次”:“一直復制”。否則在bin目次下找不到對應設置裝備擺設信息會發生報錯。
memcache基於一個存儲鍵/值對的hashmap停止存儲對象到內存中。所以我們可以懂得為重要在操作hashmap的鍵值對。
以下是一些簡略操作[增,刪,改,查,設置過時時光]:
//參數設置 string SockIOPoolName = "Test_SockIOPoolName"; string[] MemcacheServiceList = { "172.21.0.192:11211" }; //設置銜接池 SockIOPool SPool = SockIOPool.GetInstance(SockIOPoolName); SPool.SetServers(MemcacheServiceList); SPool.Initialize(); //實例化Client MemcachedClient MClient = new MemcachedClient(); MClient.PoolName = SockIOPoolName; Console.WriteLine("1.創立memcache緩存Hello World"); MClient.Add("Key1001", "Hello World"); Console.WriteLine("2.查詢緩存信息{0}", MClient.Get("Key1001")); Console.WriteLine("3.修正memcache緩存Hello World"); MClient.Set("Key1001", "Hello World - 修正版"); Console.WriteLine("4.查詢緩存信息{0}", MClient.Get("Key1001")); if (MClient.KeyExists("Key1001")) { Console.WriteLine("5.刪除memcache緩存"); MClient.Delete("Key1001"); } if (MClient.KeyExists("Key1001")) Console.WriteLine(MClient.Get("Key1001")); else Console.WriteLine("6.刪除已刪除"); Student stud = new Student() { id = "10001", name = "張三" }; MClient.Add("student", stud); Student Get_stud = MClient.Get("student") as Student; Console.WriteLine("6.緩存實體對象:{0} {1}", Get_stud.id, Get_stud.name); MClient.Add("Key1002", "我已設置過時時光1分鐘", DateTime.Now.AddMinutes(1)); while (true) { if (MClient.KeyExists("Key1002")) { Console.WriteLine("key:Key1002 Value:{0},以後時光:{1}", MClient.Get("Key1002"), DateTime.Now); Thread.Sleep(20000); } else { Console.WriteLine("key:Key1002 我已過時,以後時光:{0}", DateTime.Now); break; } }
輸入成果:
Memcached緩存過時機制:
惰性刪除:它並沒有供給監控數據過時的機制,而是惰性的,當查詢到某個key數據時,假如過時那末直接擯棄。
好比鍵key1002在2015-04-09 13:54 :18 我設置他的值為:”我已設置過時時光1分鐘“。他的過時時光為1分鐘。比及2015-04-09 13:55 :18時數據應當過時,但在內存中照樣會保留這條數據,而是等客戶端來要求這條數據時斷定數據能否過時。過時就直接刪除前往空。假如內存滿了memcached會把最長時光未應用到期的緩存記載給刪除,騰出空間持續應用。
Memcached散布存儲
上面假定memcached辦事器有node1~node3三台,運用法式要保留鍵名為“tokyo”、“kanagawa”、“chiba”、“saitama”、“gunma”的數據。
起首向memcached中添加“tokyo”。將“tokyo”傳給客戶端法式庫後,客戶端完成的算法就會依據“鍵”來決議保留數據的memcached辦事器。辦事器選定後,即敕令它保留“tokyo”及其值。
異樣,“kanagawa”、“chiba”、“saitama”、“gunma”都是先選擇辦事器再保留。接上去獲得保留的數據。獲得時也要將要獲得的鍵“tokyo”傳遞給函數庫。函數庫經由過程與數據保留時雷同的算法,依據“鍵”選擇辦事器。應用的算法雷同,就可以選中與保留時雷同的辦事器,然後發送get敕令。只需數據沒有由於某些緣由被刪除,就可以取得保留的值。
如許,將分歧的鍵保留到分歧的辦事器上,就完成了memcached的散布式。memcached辦事器增多後,鍵就會疏散,即便一台memcached辦事器產生毛病沒法銜接,也不會影響其他的緩存,體系仍然能持續運轉。 (參考:memcached周全分析)
//參數 string[] MemcacheServiceList = { "172.21.0.192:11211", "172.21.0.28:11211", "172.21.13.246:11211" }; //設置銜接池 SockIOPool SPool = SockIOPool.GetInstance(); SPool.SetServers(MemcacheServiceList); SPool.Initialize(); MemcachedClient MClient = new MemcachedClient(); MClient.FlushAll(); int count = 5; var time = Stopwatch.StartNew(); for (int i = 0; i < count; i++) { MClient.Add(i.ToString(), "value" + i); } Console.WriteLine("memcached緩存創立勝利。耗時:{0}",time.ElapsedTicks); time = Stopwatch.StartNew(); for (int i = 0; i < count; i++) { if (MClient.KeyExists(i.ToString())) { Console.WriteLine("key:{0}.value:{1}", i, MClient.Get(i.ToString())); } else { Console.WriteLine("--------未能查詢到數據key:{0}--------",i); } } Console.WriteLine("memcached緩存數據查詢完成。耗時:{0}", time.ElapsedTicks); SPool.Shutdown();
【實例代碼】