成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.NET分布式緩存之Memcached執(zhí)行速度檢測(cè)

開發(fā) 后端 分布式
為了解決緩存同步的問題,有人想出了解決辦法。本文介紹了.NET分布式緩存Memcached的執(zhí)行速度,結(jié)論是從總體速度上來看Memcached并不慢,而且可使用的內(nèi)存數(shù)量要多得多。

前不久,俺寫了篇文章談到了.Net下面的分布式緩存的一些問題,并結(jié)合DNT里面實(shí)現(xiàn)模式發(fā)表了一些自己的看法,近來通過學(xué)習(xí)相關(guān)的東西又有了一些新的體會(huì), 寫在這里作為分布式緩存列系文章的第二部分.

其實(shí)對(duì)于性的擴(kuò)展無非是Scale Up(向上擴(kuò)展)或者是Scale Out(向外擴(kuò)展), 微軟對(duì)此的看法是一個(gè)App的緩存***是以它自己為物理邊界進(jìn)行讀寫,而不要放到別處去,這樣帶的問題可能有對(duì)象的序列化傳送,反序列化,網(wǎng)絡(luò)連接開銷,跨進(jìn)程的開銷,對(duì)于高性能的站點(diǎn)來說都是不能忽視的問題.出于對(duì)這些因素的考慮微推薦的作法不是把多個(gè)應(yīng)用放在一起在多臺(tái)Server布署,而是將一個(gè)App劃分成若干個(gè)小的應(yīng)用布署到不同的服務(wù)器,下面的關(guān)系圖展示了這種關(guān)系, 這樣每種應(yīng)用就可以獨(dú)立管理自己的緩存數(shù)據(jù),但是對(duì)于象用戶數(shù)據(jù)這樣的通用數(shù)據(jù)仍然會(huì)存在多處.

.NET分布式緩存:兩種解決方案

為了解決緩存同步的問題,有人想出了解決辦法, 可以參考這兩個(gè)地方,這個(gè)是MS的,這里還有一個(gè),先來看看Peter的這個(gè)吧, 主要思想就是把要放到緩存里面的東西加上一層包裝CacheControlItem, 實(shí)現(xiàn)代碼請(qǐng)去原文出處下載.

每臺(tái)機(jī)器都維護(hù)一個(gè)WebFarm里面的成員服務(wù)器的列表,如果有新的服務(wù)器進(jìn)來發(fā)現(xiàn)自己不在這個(gè)列表中則會(huì)通知其它的服務(wù)器把它加到這個(gè)名單里面。添加緩存的這程是這樣, A服務(wù)器需要插入一個(gè)新的緩存值,它把這個(gè)項(xiàng)目插入到自己的緩存中,然后用它初始化一個(gè)CacheControlItem并指定它的緩存策略(優(yōu)先級(jí),緩存生存時(shí)間),設(shè)定它的動(dòng)作,即添加,然后把這個(gè)結(jié)象序列化通過Web傳送到每一個(gè)成員服務(wù)器,接受到這些數(shù)據(jù)的服務(wù)器跟據(jù)這個(gè)對(duì)象的Action指令,把反序列化后的對(duì)象加入到自己的緩存里面,這樣一個(gè)同步的過程就完成了,移除緩存對(duì)象的過程與之類似,只不過不需要傳送對(duì)象,只在包裝類里面設(shè)定它的Action為刪除就可以了. 當(dāng)然,為了提高性能,可以實(shí)現(xiàn)一個(gè)異步的偵聽線程專門用來響應(yīng)緩存通知的請(qǐng)求. 總體上講這處辦法的效率比較低,在數(shù)據(jù)量較大的情況下可能會(huì)造成大量緩存數(shù)據(jù)的同步數(shù)據(jù)流。

我們?cè)賮砜纯碝$是怎么做的,它的想法類似,只不過它不在WebFarm的成員服務(wù)器之間同步緩存,而只是保證每臺(tái)機(jī)器不要讀到已經(jīng)失效的緩存數(shù)據(jù),當(dāng)緩存數(shù)據(jù)失效時(shí)(相關(guān)依賴數(shù)據(jù)被更新), 通過維護(hù)一個(gè)需要通知的服務(wù)器列表依次調(diào)用每臺(tái)服務(wù)器上的WebService,如果當(dāng)前服務(wù)器上存在這鍵值的緩存則使它失效.

這兩個(gè)老外寫的東西似乎都比較啰索,不過對(duì)初學(xué)者來說比較友好,可以一步步地知道這件事情的來龍去脈,理解會(huì)清楚更刻一些。

.NET分布式緩存:Memcached到底有多快?

看了這些如果還不滿意,那么您可以試試Memcached它可以運(yùn)行在Win32平臺(tái)下,在上篇文章中我們已經(jīng)提到了這個(gè)東西,但是它在.Net的平臺(tái)下面究竟表現(xiàn)如何?是否能象在PHP平臺(tái)下面一樣地優(yōu)秀,我們現(xiàn)在來做一個(gè)簡(jiǎn)單的測(cè)試, 對(duì)比使用.Net自帶的Cache和Memcached兩種實(shí)現(xiàn)方式,看看差距究竟有多大,過程是這樣,分別生成10000個(gè)字符串對(duì)象并分別設(shè)定鍵值插入到緩存中,然后再取出來,看看花費(fèi)的總時(shí)間. 服務(wù)器端:memcached-1.2.1-win32, 客戶端: memcacheddotnet_clientlib-1.1.5, 服務(wù)器端的使用也比較簡(jiǎn)單,解壓文件之后在命令行下面輸入: c:\memcached -d install 先安裝服務(wù), 接著 c:\memcached -d start就可以了,詳細(xì)使用方法見說明文件 -h 是查看幫助, 測(cè)試環(huán)境如下:

Memcached服務(wù)器 : Win2003 sp1, Framework 2.0,P4 D 3.4G, 768MB 內(nèi)存, 千兆網(wǎng)卡.

Memcached客戶機(jī) : Win2003 sp1, Framework 2.0,T2060, 1G內(nèi)存( 沙加的神舟筆記本;) ), 千兆網(wǎng)卡.

兩臺(tái)機(jī)器通過直連線相連.

.Net Cache單機(jī)測(cè)試 : P4 D 3.4G, 768MB 內(nèi)存.

測(cè)試結(jié)果, 存取10000個(gè)條目的時(shí)間:

  1. Memcached  
  2. Set(秒)  1.48  1.37  1.48  1.37  1.46    
  3. Get(秒)  2.42 2.42  2.42  2.43  2.42    
  4.  
  5. HttpRuntime.Cache  
  6. Set(秒)  0.015  0.015  0.015  0.015  0.015    
  7. Get(秒)  
  8.  0.015 0.015  0.015  0.015  0.015    

.Net內(nèi)建緩存測(cè)試代碼

HttpRuntime.Cache

  1. protected void Page_Load(object sender, EventArgs e)  
  2. {  
  3.         int start = 200;  
  4.         int runs = 10000;  
  5.  
  6.         string keyBase = "testKey";  
  7.         string obj = "This is a test of an object blah blah es, serialization does not seem to slow things down so much.  The gzip compression is horrible horrible performance, so we only use it for very large objects.  I have not done any heavy benchmarking recently";  
  8.  
  9.         long begin = DateTime.Now.Ticks;  
  10.         for(int i = start; i < start+runs; i++)   
  11.         {  
  12.             HttpRuntime.Cache.Add(keyBase + i, obj,null,System.Web.Caching.Cache.NoAbsoluteExpiration,  
  13.                 TimeSpan.FromMinutes(1),System.Web.Caching.CacheItemPriority.Normal,null);  
  14.         }  
  15.         long end = DateTime.Now.Ticks;  
  16.         long time = end - begin;  
  17.  
  18.         Response.Write(runs + " sets: " + new TimeSpan(time).ToString() + "ms<br />");  
  19.  
  20.         begin = DateTime.Now.Ticks;  
  21.         int hits = 0;  
  22.         int misses = 0;  
  23.         for(int i = start; i < start+runs; i++)   
  24.         {  
  25.             string str = (string) HttpRuntime.Cache.Get(keyBase + i);  
  26.             if(str != null)  
  27.                 ++hits;  
  28.             else 
  29.                 ++misses;  
  30.         }  
  31.         end = DateTime.Now.Ticks;  
  32.         time = end - begin;  
  33.  
  34.         Response.Write(runs + " gets: " + new TimeSpan(time).ToString() + "ms");  
  35. }  

Memcached測(cè)試代碼

Memcached

  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.             int runs = 100;  
  14.             int start = 200;  
  15.             if(args.Length > 1)  
  16.             {  
  17.                 runs = int.Parse(args[0]);  
  18.                 start = int.Parse(args[1]);  
  19.             }  
  20.  
  21.             string[] serverlist = { "140.192.34.72:11211""140.192.34.73:11211" };  
  22.  
  23.             // initialize the pool for memcache servers  
  24.             SockIOPool pool = SockIOPool.GetInstance();  
  25.             pool.SetServers(serverlist);  
  26.  
  27.             pool.InitConnections = 3;  
  28.             pool.MinConnections = 3;  
  29.             pool.MaxConnections = 5;  
  30.  
  31.             pool.SocketConnectTimeout = 1000;  
  32.             pool.SocketTimeout = 3000;  
  33.  
  34.             pool.MaintenanceSleep = 30;  
  35.             pool.Failover = true;  
  36.  
  37.             pool.Nagle = false;  
  38.             pool.Initialize();  
  39.  
  40.             MemcachedClient mc = new MemcachedClient();  
  41.             mc.EnableCompression = false;  
  42.  
  43.             string keyBase = "testKey";  
  44.             string obj = "This is a test of an object blah blah es, serialization does not seem to slow things down so much.  The gzip compression is horrible horrible performance, so we only use it for very large objects.  I have not done any heavy benchmarking recently";  
  45.  
  46.             long begin = DateTime.Now.Ticks;  
  47.             for(int i = start; i < start+runs; i++)   
  48.             {  
  49.                 mc.Set(keyBase + i, obj);  
  50.             }  
  51.             long end = DateTime.Now.Ticks;  
  52.             long time = end - begin;  
  53.  
  54.             Console.WriteLine(runs + " sets: " + new TimeSpan(time).ToString() + "ms");  
  55.  
  56.             begin = DateTime.Now.Ticks;  
  57.             int hits = 0;  
  58.             int misses = 0;  
  59.             for(int i = start; i < start+runs; i++)   
  60.             {  
  61.                 string str = (string) mc.Get(keyBase + i);  
  62.                 if(str != null)  
  63.                     ++hits;  
  64.                 else 
  65.                     ++misses;  
  66.             }  
  67.             end = DateTime.Now.Ticks;  
  68.             time = end - begin;  
  69.  
  70.             Console.WriteLine(runs + " gets: " + new TimeSpan(time).ToString() + "ms");  
  71.             Console.WriteLine("Cache hits: " + hits.ToString());  
  72.             Console.WriteLine("Cache misses: " + misses.ToString());  
  73.  
  74.             IDictionary stats = mc.Stats();  
  75.             foreach(string key1 in stats.Keys)  
  76.             {  
  77.                 Console.WriteLine(key1);  
  78.                 Hashtable values = (Hashtable)stats[key1];  
  79.                 foreach(string key2 in values.Keys)  
  80.                 {  
  81.                     Console.WriteLine(key2 + ":" + values[key2]);  
  82.                 }  
  83.                 Console.WriteLine();  
  84.             }  
  85.  
  86.             SockIOPool.GetInstance().Shutdown();  
  87.         }  
  88.     }  
  89. }  

結(jié)論

通過這個(gè)對(duì)比測(cè)試我們可以看出內(nèi)建的Cache比使用Memcached要快出約130倍,但是從總體速度上來看Memcached并不慢,這兩種方式可以在項(xiàng)目中有選擇性地結(jié)合使用可以產(chǎn)生很棒的效果.并且Memcached可使用的內(nèi)存數(shù)量要多得多,同時(shí)也可以做集群避免單點(diǎn)問題.

以上就介紹了.NET分布式緩存之Memcached的速度檢測(cè)。本文來自沙加的博客:《.Net下的分布式緩存(2)--實(shí)現(xiàn)分布式緩存同步的手段》

【編輯推薦】

  1. 如何避免ASP.NET緩存占用系統(tǒng)資源
  2. .NET緩存機(jī)制探討與比對(duì)
  3. 概述ASP.NET緩存機(jī)制
  4. ASP.NET數(shù)據(jù)緩存之?dāng)?shù)據(jù)緩存淺談
  5. ASP.NET數(shù)據(jù)緩存機(jī)制淺析
責(zé)任編輯:yangsai 來源: 沙加的博客
相關(guān)推薦

2009-11-09 09:25:24

Memcached入門

2009-02-06 09:38:38

memcached分布式緩存系統(tǒng)ASP.NET

2019-07-04 15:13:16

分布式緩存Redis

2009-02-10 08:57:01

分布式緩存.Net開發(fā)

2018-02-07 10:46:20

數(shù)據(jù)存儲(chǔ)

2011-11-30 14:21:19

Java分布式緩存

2023-05-12 11:52:21

緩存場(chǎng)景性能

2023-02-28 07:01:11

分布式緩存平臺(tái)

2013-06-13 11:29:14

分布式分布式緩存

2019-02-18 11:16:12

Redis分布式緩存

2018-07-17 08:14:22

分布式分布式鎖方位

2020-04-28 14:25:14

緩存分布式數(shù)據(jù)

2023-10-09 09:27:33

Docker容器

2011-05-11 16:42:21

.NET Remoti

2018-12-14 10:06:22

緩存分布式系統(tǒng)

2023-01-13 07:39:07

2015-09-21 09:20:11

C#Couchbase使用

2017-12-12 14:51:15

分布式緩存設(shè)計(jì)

2022-04-07 17:13:09

緩存算法服務(wù)端

2012-02-28 10:30:56

C#.NET
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲电影免费 | 免费人成在线观看网站 | 国产精品美女久久久久久久网站 | 视频在线观看亚洲 | 日本激情视频中文字幕 | 国产成人精品一区二区三区 | 成人免费观看男女羞羞视频 | 二区亚洲 | 中文字幕av网站 | 欧美成人手机在线 | 国产性网| 一区二区在线不卡 | 色本道| 国产羞羞视频在线观看 | 一区二区伦理电影 | 亚洲综合在线播放 | 欧美综合自拍 | 一级毛片免费完整视频 | 国产日韩欧美在线观看 | 成人欧美日韩一区二区三区 | 91精品中文字幕一区二区三区 | www.国产视频 | 久久精品二区亚洲w码 | 国产超碰人人爽人人做人人爱 | 日韩精品 电影一区 亚洲 | 啪视频在线 | 国产高清在线观看 | 亚洲精品免费视频 | 一区二区三区在线播放 | 麻豆精品久久久 | 精品视频一区二区三区在线观看 | 四虎影视一区二区 | 日本精品久久 | 精品久久久精品 | 欧美xxxx性xxxxx高清 | 成人一区二区三区 | 国产小视频在线 | 日韩一区二区三区精品 | 亚洲第一在线 | 久草视频在线播放 | 美国一级毛片a |