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

.NET分布式緩存之Memcached執行速度檢測

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

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

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

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

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

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

我們再來看看M$是怎么做的,它的想法類似,只不過它不在WebFarm的成員服務器之間同步緩存,而只是保證每臺機器不要讀到已經失效的緩存數據,當緩存數據失效時(相關依賴數據被更新), 通過維護一個需要通知的服務器列表依次調用每臺服務器上的WebService,如果當前服務器上存在這鍵值的緩存則使它失效.

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

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

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

Memcached服務器 : Win2003 sp1, Framework 2.0,P4 D 3.4G, 768MB 內存, 千兆網卡.

Memcached客戶機 : Win2003 sp1, Framework 2.0,T2060, 1G內存( 沙加的神舟筆記本;) ), 千兆網卡.

兩臺機器通過直連線相連.

.Net Cache單機測試 : P4 D 3.4G, 768MB 內存.

測試結果, 存取10000個條目的時間:

  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內建緩存測試代碼

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測試代碼

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. }  

結論

通過這個對比測試我們可以看出內建的Cache比使用Memcached要快出約130倍,但是從總體速度上來看Memcached并不慢,這兩種方式可以在項目中有選擇性地結合使用可以產生很棒的效果.并且Memcached可使用的內存數量要多得多,同時也可以做集群避免單點問題.

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

【編輯推薦】

  1. 如何避免ASP.NET緩存占用系統資源
  2. .NET緩存機制探討與比對
  3. 概述ASP.NET緩存機制
  4. ASP.NET數據緩存之數據緩存淺談
  5. ASP.NET數據緩存機制淺析
責任編輯:yangsai 來源: 沙加的博客
相關推薦

2009-11-09 09:25:24

Memcached入門

2009-02-06 09:38:38

memcached分布式緩存系統ASP.NET

2019-07-04 15:13:16

分布式緩存Redis

2009-02-10 08:57:01

分布式緩存.Net開發

2018-02-07 10:46:20

數據存儲

2011-11-30 14:21:19

Java分布式緩存

2023-05-12 11:52:21

緩存場景性能

2023-02-28 07:01:11

分布式緩存平臺

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

緩存分布式數據

2023-10-09 09:27:33

Docker容器

2011-05-11 16:42:21

.NET Remoti

2018-12-14 10:06:22

緩存分布式系統

2023-01-13 07:39:07

2015-09-21 09:20:11

C#Couchbase使用

2017-12-12 14:51:15

分布式緩存設計

2022-04-07 17:13:09

緩存算法服務端

2012-02-28 10:30:56

C#.NET
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天av天天好逼 | 夜夜干夜夜操 | 91精品国产一二三 | www.日韩在线| 久久久99精品免费观看 | 国产成人精品免费视频 | 免费黄网站在线观看 | 欧美精品在线一区 | 性一爱一乱一交一视频 | 国产99精品 | 国产精品日韩一区二区 | 成人精品视频在线 | 日本久久网 | 亚洲免费视频在线观看 | 99视频在线| 麻豆久久久久久久 | 在线观看成人 | 国产精品久久久久久久久久东京 | 国产真实乱对白精彩久久小说 | 资源首页二三区 | 99日韩| 懂色av色香蕉一区二区蜜桃 | 麻豆hd| 夜夜精品浪潮av一区二区三区 | 欧美久久久久久久久 | 毛片一级黄色 | 日韩插插| 日韩欧美在线一区 | 91欧美激情一区二区三区成人 | 99国产精品久久久久久久 | 国产高清免费 | 精品中文在线 | 日韩三极| 少妇淫片aaaaa毛片叫床爽 | 亚洲成人二区 | 亚洲国产情侣 | www.yw193.com| 精品av | h视频在线免费 | 香蕉久久久 | 亚洲三区在线观看 |