實例解析.NET版分布式緩存Memcached_.Net教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:試析ASP.NET的IIS映射
      ASP.NET默認擴展名為.aspx,可是我們看到許多網站的擴展名很特別,比如校內的do。個性之余還可以實現簡單的偽靜態(即把后綴改為html)不過相對URLRewriter來說,是有點簡陋(只能改掉連接中的.aspx),不過不失為一種方法。下面我們就來實現他! 先來說一下

      下面測試下分布式緩存Memcached軟件,一直在學習關注大訪問量網站的緩存是如何實現,之前看過Memcached的資料,忙于沒有時間來真正測試一下,本文測試分布式緩存Memcached的環境如下:(兩臺電腦作為服務器)

      第一臺:

      CPU:Inter(R) Pentium(R) 4 CPU 2.8G

      內存:1G

      系統:windows 7

      IIS: IIS 7

      IP:172.10.1.97

      環境:本地

      安裝:memcached 1.2.1 for Win32

      第二臺:

      CPU:Inter(R) Pentium(R) 4 CPU 3.0G

      內存:2G

      系統:windows Server 2003

      IIS: IIS 6

      IP:172.10.1.236

      環境:遠程

      安裝:memcached 1.2.1 for Win32

      測試程序部署到本地環境(172.10.1.97),開發工具VS2008 .NET3.5

      本文使用到memcached 1.2.1 for Win32下載地址:

      http://jehiah.cz/projects/memcached-win32/

      更多memcached版本大全請進入

      http://www.xueit.com/html/2009-11-12/32-1550931594781.html

      好了,下面我們按步驟來測試:

      第一、首先到把下載好的memcached 1.2.1解壓到C:\memcached目錄,分別復制到兩臺服務器中。

      第二、安裝memcached服務,在命令提示符輸入CD c:\memcached進入到memcached目錄,如下圖:

      之后輸入memcached -h 回車,看幫助說明,接下來輸入memcached -d install 回車即可自動安裝memcached服務了,如下圖:

      安裝memcached服務圖

      安裝好安裝memcached服務后,輸入memcached -d start 回車啟動memcached服務,如下圖:

      啟動memcached服務圖

      在172.10.1.97與172.10.1.236兩臺電腦都按以上操作來安裝啟動memcached。

      第三、下載.NET版memcached客戶端API組件來寫測試程序。

      本文使用memcacheddotnet,下載地址如下:

      http://sourceforge.net/projects/memcacheddotnet/

      下載好之后把這些文件Commons.dll,ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll放到bin目錄(少一個都不行),之后再到測試項目開發環境引用Memcached.ClientLibrary.dll,如下圖

      引用Memcached.ClientLibrary.dll圖

      第四、測試程序:

      以下為引用的內容:
      using System;
      using System.Collections;
      using System.Text;

      // 須引用Memcached
      using Memcached.ClientLibrary;

      namespace test
      {
         
      public partial class _Default : System.Web.UI.Page
          {
             
      protected void Page_Load(object sender, EventArgs e)
              {
                 
      if (!IsPostBack)
                  {
                     
      if (Request["action"] == "clear")
                         
      this.clear();
                     
      else
                         
      this.test();
                  }
              }

             
      /// <summary>
             
      /// 清空緩存
             
      /// </summary>
              public void clear()
              {
                 
      string[] servers = { "172.10.1.97:11211", "172.10.1.236:11211" };

                 
      //初始化池
                  SockIOPool pool = SockIOPool.GetInstance();
                  pool.SetServers(servers);
                  pool.InitConnections
      = 3;
                  pool.MinConnections
      = 3;
                  pool.MaxConnections
      = 5;
                  pool.SocketConnectTimeout
      = 1000;
                  pool.SocketTimeout
      = 3000;
                  pool.MaintenanceSleep
      = 30;
                  pool.Failover
      = true;
                  pool.Nagle
      = false;
                  pool.Initialize();
                  MemcachedClient mc
      = new Memcached.ClientLibrary.MemcachedClient();
                  mc.EnableCompression
      = false;
                  mc.Delete(
      "cache");
                  mc.Delete(
      "endCache");
                  Response.Write(
      "清空緩存成功");
              }

             
      /// <summary>
             
      /// 測試緩存
             
      /// </summary>
              public void test()
              {
                 
      //分布Memcachedf服務IP 端口
                  string[] servers = { "172.10.1.97:11211","172.10.1.236:11211" };

                 
      //初始化池
                  SockIOPool pool = SockIOPool.GetInstance();
                  pool.SetServers(servers);
                  pool.InitConnections
      = 3;
                  pool.MinConnections
      = 3;
                  pool.MaxConnections
      = 5;
                  pool.SocketConnectTimeout
      = 1000;
                  pool.SocketTimeout
      = 3000;
                  pool.MaintenanceSleep
      = 30;
                  pool.Failover
      = true;
                  pool.Nagle
      = false;
                  pool.Initialize();
                 
      //客戶端實例
                  MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
                  mc.EnableCompression
      = false;
                  StringBuilder sb
      = new StringBuilder();
                 
      //寫入緩存
                  sb.AppendLine("寫入緩存測試:");
                  sb.AppendLine(
      "<br>_______________________________________<br>");
                 
      if (mc.KeyExists("cache"))
                  {
                      sb.AppendLine(
      "緩存cache已存在");
                  }
                 
      else
                  {
                      mc.Set(
      "cache", "寫入緩存時間:"   DateTime.Now.ToString());
                      sb.AppendLine(
      "緩存已成功寫入到cache");
                  }
                  sb.AppendLine(
      "<br>_______________________________________<br>");
                  sb.AppendLine(
      "讀取緩存內容如下:<br>");
                  sb.AppendLine(mc.Get(
      "cache").ToString());

                 
      //測試緩存過期
                  sb.AppendLine("<br>_______________________________________<br>");
                 
      if (mc.KeyExists("endCache"))
                  {
                      sb.AppendLine(
      "緩存endCache已存在,過期時間為:"   mc.Get("endCache").ToString());
                  }
                 
      else
                  {
                      mc.Set(
      "endCache", DateTime.Now.AddMinutes(1).ToString(), DateTime.Now.AddMinutes(1));
                      sb.AppendLine(
      "緩存已更新寫入到endCache,寫入時間:"   DateTime.Now.ToString()   " 過期時間:"   DateTime.Now.AddMinutes(1).ToString());
                  }

                 
      //分析緩存狀態
                  Hashtable ht = mc.Stats();
                  sb.AppendLine(
      "<br>_______________________________________<br>");
                  sb.AppendLine(
      "Memcached Stats:");
                  sb.AppendLine(
      "<br>_______________________________________<br>");
                 
      foreach (DictionaryEntry de in ht)
                  {
                      Hashtable info
      = (Hashtable)de.Value;
                     
      foreach (DictionaryEntry de2 in info)
                      {
                          sb.AppendLine(de2.Key.ToString()  
      ":&nbsp;&nbsp;&nbsp;&nbsp;"   de2.Value.ToString()   "<br>");
                      }
                  }
                  Response.Write(sb.ToString());
              }
          }

      第五、 運行看效果:

      緩存效果圖我在本地172.10.1.97運行memcached -d

      stop來停止memcached服務,運行上面程序,一樣正確,說明緩存也同樣保存到遠程172.10.1.236這臺服務器了。這樣簡單就可以實現分布式緩存,使用緩存又多了一個選擇,不必使用.NET自帶的Application與cache了,訪問量大的網站實現分布式緩存有很多好處。

      分享:淺談ASP.NET的PHP執行速度
      上星期我在InfoQ發表了一篇新聞,對Joe Stagner在博客上發表的三篇關于ASP.NET與PHP性能對比的文章進行了總結。寫新聞其實挺不爽的,因為不能夾雜個人的看法,只能平鋪直敘陳述事實。當然,如果像某些新聞那樣換一種說法是可以騙過一些不明真相的群眾,但是

      來源:模板無憂//所屬分類:.Net教程/更新時間:2009-11-17
      相關.Net教程