.NET下实现分布式缓存系统Memcached
| 【IT168 技術文檔】在Web應用程序中,數據通常保存在RDBMS中,應用服務器從數據庫中讀取數據并在瀏覽器中顯示。但隨著數據量的增大、訪問的集中,就會出現RDBMS的負載加重、數據庫響應變慢、網站顯示延遲等重大影響。為了緩解數據庫的壓力,提升Web應用程序的響應速度,人們提出了Web緩存的概念,這里緩存的概念不同于計算機硬盤控制器上的一塊內存芯片。Web緩存位于Web服務器(1個或多個,內容源服務器)和客戶端之間(1個或多個),緩存會根據進來的請求保存輸出內容的副本,例如html頁面, 圖片,文件(統稱為副本),然后,當下一個請求來到的時候,如果是相同的URL,緩存直接使用副本響應訪問請求,而不是向內容源服務器再次發送請求。使用緩存可以減少相應延遲,因為請求在緩存服務器(離客戶端更近)而不是源服務器被相應,這個過程耗時更少,讓web服務器看上去相應更快;當副本被重用時還可以減少網絡帶寬消耗。 緩存的工作方式 緩存的工作方式如下圖所示: 上圖中的緩存服務器維護一個集中緩存并在其中存放經常被請求的對象,任何 Web 瀏覽器客戶端都可以訪問該緩存。來自內存/磁盤緩存的對象所需的處理資源比來自其他網絡的對象所需的處理資源要少得多。因此,這可以提高客戶端瀏覽器性能、縮短用戶響應時間并減少Internet 連接所消耗的帶寬。 上圖1到6標示了當用戶請求對象時,緩存服務器是如何響應的,主要經過下列步驟: 第一個用戶(客戶端 1)請求 Web 對象。 緩存服務器檢查該對象是否存在于緩存中。由于該對象不存在于緩存服務器緩存中,因此,緩存服務器從Internet中的服務器請求該對象。 Internet上的服務器將該對象返回給緩存服務器計算機。 緩存服務器將該對象的一個副本保留在其緩存中,并將對象返回給客戶端 1。 客戶端 2請求相同的對象。 緩存服務器從其緩存中返回該對象,而不是從Internet中獲取該對象。 一般在組織的Web服務器前面部署緩存服務器。Web服務器是主持商業 Web 業務或可由業務合作伙伴訪問的服務器。使用傳入的Web請求,緩存服務器可以充當外部環境的 Web 服務器,并通過其緩存來完成客戶端對Web內容的請求。只有在緩存無法處理請求時,緩存服務器才將請求轉發到Web服務器。 目前實現緩存的機制有幾種,Memcached就是其中的一種。本文介紹了Memcached的概念,基本原理以及工作機制,并介紹了如何在ASP.NET中使用Memcache進行開發Web應用程序以提升Web應用程序的性能。 Memcached介紹 Memcached是一個高性能的分布式的內存對象緩存系統。Memcached是為了加快http://www.livejournal.com/訪問速度而誕生的一個項目,由Danga Interactive開發的,它通過在內存里維護一個統一的巨大的hash表來存儲各種格式的數據,包括圖像、視 頻、文件以及數據庫檢索的結果等。雖然最初為了加速 LiveJournal 訪問速度而開發的,但是后來被很多大型的網站采用。它的緩存是一種分布式的,也就是可以允許不同主機上的多個用戶同時訪問這個緩存系統,這種方法不僅解決了共享內存只能是單機的弊端,同時也解決了數據庫檢索的壓力,最大的優點是提高了訪問獲取數據的速度,Memcached用于在動態應用中減少數據庫負載,提升訪問速度,但是用來加速Web應用、降低數據庫負載時比較多。Memcached也完全可以用到其他地方,比如分布式數據庫,分布式計算等領域。 Memcache的特點 Memcached作為高速運行的分布式緩存服務器,具有以下的特點。 協議簡單。Memcached的服務器客戶端通信并不使用復雜的XML等格式, 而使用簡單的基于文本行的協議。因此,通過telnet也能在memcached上保存數據、取得數據。 基于libevent的事件處理,libevent是一個事件觸發的網絡庫,適用于windows、linux、bsd等多種平臺,內部使用select、epoll、kqueue等系統調用管理事件機制。而且libevent在使用上可以做到跨平臺,而且根據libevent官方網站上公布的數據統計,似乎也有著非凡的性能。 內置內存存儲方式。為了提高性能,memcached中保存的數據都存儲在memcached內置的內存存儲空間中。 由于數據僅存在于內存中,因此重啟memcached、重啟操作系統會導致全部數據消失。 另外,內容容量達到指定值之后,就基于LRU(Least Recently Used)算法自動刪除不使用的緩存。 memcached本身是為緩存而設計的服務器,因此并沒有過多考慮數據的永久性問題。memcached默認情況下采用了名為Slab Allocator的機制分配、管理內存。 在該機制出現以前,內存的分配是通過對所有記錄簡單地進行malloc和free來進行的。 但是,這種方式會導致內存碎片,加重操作系統內存管理器的負擔,最壞的情況下,會導致操作系統比memcached進程本身還慢。 memcached不互相通信的分布式。memcached盡管是“分布式”緩存服務器,但服務器端并沒有分布式功能。各個memcached不會互相通信以共享信息。那么,怎樣進行分布式呢?這完全取決于客戶端的實現。Cache::Memcached的分布式方法簡單來說,就是“根據服務器臺數的余數進行分散”。 求得鍵的整數哈希值,再除以服務器臺數,根據其余數來選擇服務器。 Memcached的緩存是一種分布式的,可以讓不同主機上的多個用戶同時訪問, 因此解決了共享內存只能單機應用的局限,更不會出現使用數據庫做類似事情的時候,磁盤開銷和阻塞的發生。 Memcached使用了libevent(如果可以的話,在linux下使用epoll)來均衡任何數量的打開鏈接,使用非阻塞的網絡I/O, 對內部對象實現引用計數(因此,針對多樣的客戶端,對象可以處在多樣的狀態), 使用自己的頁塊分配器和哈希表, 因此虛擬內存不會產生碎片并且虛擬內存分配的時間復雜度可以保證為O(1)。 許多語言都實現了連接memcached的客戶端,其中以Perl、PHP為主。 僅僅memcached網站上列出的語言就有Perl、PHP、Python、Ruby、C#、C/C++等等。 Memcached的工作機制 Memcached通過在內存中開辟一塊區域來維持一個大的hash表來加快頁面訪問速度,雖然和數據庫是獨立的,但是目前主要用來緩存數據庫的數據。允許多個server通過網絡形成一個大的hash,用戶不必關心數據存放在哪,只調用相關接口就可。存放在內存的數據通過LRU算法進行淘汰出內存。同時可以通過刪除和設置失效時間來淘汰存放在內存的數據。 Memcached在.NET中的應用 一.Memcached服務器端的安裝(此處將其作為系統服務安裝) 下載文件:memcached 1.2.1 for Win32 binaries (Dec 23, 2006) 下載地址:http://jehiah.cz/projects/memcached-win32/files/memcached-1.2.1-win32.zip 1.解壓縮文件到c:\memcached 2.命令行輸入 c:\memcached\memcached.exe -d install' 3.命令行輸入 c:\memcached\memcached.exe -d start ,該命令啟動 Memcached ,默認監聽端口為 11211 通過 memcached.exe -h 可以查看其幫助,查看memcache狀態,telnet 192.168.0.98 11211。輸入stats查詢狀態 stats STAT pid 8601 STAT uptime 696 STAT time 1245832689 STAT version 1.2.0 STAT pointer_size 64 STAT rusage_user 0.007998 STAT rusage_system 0.030995 STAT curr_items 1 STAT total_items 1 STAT bytes 76 STAT curr_connections 2 STAT total_connections 4 STAT connection_structures 3 STAT cmd_get 1 STAT cmd_set 1 STAT get_hits 1//命中次數 STAT get_misses 0 //失效次數 STAT bytes_read 97 STAT bytes_written 620 STAT limit_maxbytes 134217728 END -d選項是啟動一個守護進程 -m是分配給Memcache使用的內存數量,單位是MB,我這里是10MB -u是運行Memcache的用戶 -l是監聽的服務器IP地址,如果有多個地址的話,我這里假定指定了服務器的IP地址為本機ip地址 ????? -p是設置Memcache監聽的端口,我這里設置了12000,最好是1024以上的端口 -c選項是最大運行的并發連接數,默認是1024,我這里設置了256,按照你服務器的負載量來設定 -P是設置保存Memcache的pid文件 二..NET memcached client library(memcached的.NET客戶端類庫) 下載memcached的.NET客戶端類庫,下載地址:https://sourceforge.net/projects/memcacheddotnet/里面有.net1.1 和 .net2.0的兩種版本,里面還有.NET應用memcached的例子。 三.應用 1.新建ASP.NET站點,將Commons.dll,ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll添加到web引用。 2.為了進行后續的測試,我們創建兩個aspx頁面,memcache.aspx和nomemcache.aspx,memcache.aspx是使用MemcacheClient類加入了緩存機制的頁面。nomemcache.aspx是沒有加入緩存機制的頁面,直接連接的數據庫。一會我們通過觀察數據庫事件和進行壓力測試來測試在壓力測試的情況下應用程序的性能。 3.memcache.aspx.cs中添加對Memcached.ClientLibrary.dll的引用,即:using Memcached.ClientLibrary;Page_Load()中加入如下代碼。 protected void Page_Load(object sender, EventArgs e) { string[] serverlist = new string[] { "127.0.0.1:11211" }; string poolName = "MemcacheIOPool"; SockIOPool pool = SockIOPool.GetInstance(poolName); //設置連接池的初始容量,最小容量,最大容量,Socket 讀取超時時間,Socket連接超時時間 pool.SetServers(serverlist); pool.InitConnections = 1; pool.MinConnections = 1; pool.MaxConnections = 500; pool.SocketConnectTimeout = 1000; pool.SocketTimeout = 3000; pool.MaintenanceSleep = 30; pool.Failover = true; pool.Nagle = false; pool.Initialize();//容器初始化 //實例化一個客戶端 MemcachedClient mc = new MemcachedClient(); mc.PoolName = poolName; mc.EnableCompression = false; string key = "user_info";//key值 object obj = new object(); if (mc.KeyExists(key)) //測試緩存中是否存在key的值 { obj = mc.Get(key); User user2 = (User)obj; Response.Write(" } else { string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; SqlConnection conn = new SqlConnection(conStr); conn.Open(); string sql = "Select * From T_User Where id=1"; SqlCommand cmd = new SqlCommand(sql, conn); SqlDataReader dr = cmd.ExecuteReader(); User user = new User(); while (dr.Read()) { user.Name = dr["name"].ToString(); user.Pwd = dr["pwd"].ToString(); } dr.Close(); conn.Close(); mc.Set(key, user, System.DateTime.Now.AddMinutes(2)); //存儲數據到緩存服務器,這里將user這個對象緩存,key 是"user_info1" Response.Write(" } } 4.nomemcache.aspx是沒有加緩存機制的直接連接數據庫的頁面。nomemcache.aspx.cs中的代碼: protected void Page_Load(object sender, EventArgs e) { string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; SqlConnection conn = new SqlConnection(conStr); conn.Open(); string sql = "Select * From T_User Where id=2"; SqlCommand cmd = new SqlCommand(sql, conn); SqlDataReader dr = cmd.ExecuteReader(); User user = new User(); while (dr.Read()) { user.Name = dr["name"].ToString(); user.Pwd = dr["pwd"].ToString(); } dr.Close(); conn.Close(); Response.Write(" } } 5.測試 測試memcache.aspx頁面,該測試的主要目的是訪問memcache.aspx頁面,看是否看該頁面走的是memcached而非訪問的數據庫(第一次是訪問數據庫)。首先,我們運行memcache.aspx頁面,通過Sql Server Profiler來查看運行memcache.aspx頁面對數據庫的操作情況。第一次運行memcache.aspx的時候,Sql Server Profiler里面顯示memcache.aspx對數據庫的操作,即執行了Select * From T_User Where id=1。 memcache.aspx頁面上第一次運行的時候顯示如下信息: 通過讀取數據庫得到的數據: 姓名:lucy,密碼:lucy。 接著我們刷新memcache.aspx頁面,頁面上還顯示上述信息: 通過讀取緩存得到的數據: 姓名:lucy,密碼:lucy 但從Sql Server Profiler觀察,memcache.aspx頁面沒有對數據庫進行任何操作。說明我們第二次訪問該頁面是讀取的緩存,接著不停的刷新頁面,都顯示的是通過讀取緩存得到的數據。直到到達緩存失效時間。 測試nomemcache.aspx,我們運行nomemcache.aspx頁面,每刷新一次(包括第一次),Sql Server Profiler都記錄了,nomemcache.aspx頁面對數據庫進行的操作,即之行了Select * From T_User Where id=2語句。說明每訪問一次該頁面,都要進行一次數據庫的訪問操作。 ? 四.壓力測試以及性能分析 這里我們使用Microsoft Web Application Stress Tool對web進行壓力測試,Microsoft Web Application Stress Tool 是由微軟的網站測試人員所開發,專門用來進行實際網站壓力測試的一套工具。透過這套功能強大的壓力測試工具,您可以使用少量的客戶端計算機仿真大量用戶上 線對網站服務所可能造成的影響,在網站實際上線之前先對您所設計的網站進行如同真實環境下的測試,以找出系統潛在的問題,對系統進行進一步的調整、設置工 作。就是因為這些特性,才使它具備了DOS轟炸的功能。 1、工具簡單設置 打開Web Application Stress Tool,很簡潔的一個頁面,上面是工具欄,左下方是功能選項,右下方是詳細設置選項。在對目標Web服務器進行壓力測試之前,先對它進行一些必要的設置。 (1).在“settings”的功能設置中(如下圖),一個是Stress level (threads)這里是指定程序在后臺用多少線程進行請求,也就是相當于模擬多少個客戶機的連接,更加形象的就是說設置多少轟炸的線程數。一般填寫 500~1000,因為這個線程數是根據本機的承受力來設置的,如果你對自己的機器配置有足夠信心的話,那么設置的越高,轟炸的效果越好。 (2).在“Test Run Time”中來指定一次壓力測試需要持續的時間,分為天、小時、分、秒幾個單位級別,你根據實際情況來設置吧!這里面設置測試時間為1分鐘。 (3).其余的選項大家可以根據自己的情況設置。 2、壓力測試 步驟1:在工具中點右鍵,選擇Add命令,增加了一個新的測試項目:memcache,對它進行設置,在主選項中的server中填寫要測試的服務器的IP地址,這里我們是在本機上進行測試,所以填寫localhost。在下方選擇測試的Web連接方式,這里的方式Verb選擇 get,path選擇要測試的Web頁面路徑,這里填寫/WebMemCache/memcache.aspx,即加入緩存的memcache.aspx頁面(如下圖)。 步驟2:在“Settings”的功能設置中將Stress level (threads)線程數設置為500。完畢后,點工具中的灰色三角按鈕即可進行測試(如下圖)。 同理,我們在建一個nomemcach的項目用來測試nomemcache.aspx頁面。Memcach和nomemcach測試完畢后,點擊工具欄上的Reports按鈕查看測試報告: 3.性能分析 Memcache.aspx的測試報告: Overview ================================================================================ Report name: 2009-7-20 10:52:00 Run on: 2009-7-20 10:52:00 Run length: 00:01:12 Web Application Stress Tool Version:1.1.293.1 Number of test clients: 1 Number of hits: 2696 Requests per Second: 44.93 Socket Statistics -------------------------------------------------------------------------------- Socket Connects: 3169 Total Bytes Sent (in KB): 646.80 Bytes Sent Rate (in KB/s): 10.78 Total Bytes Recv (in KB): 2019.37 Bytes Recv Rate (in KB/s): 33.65 Socket Errors -------------------------------------------------------------------------------- Connect: 0 Send: 0 Recv: 0 Timeouts: 0 RDS Results -------------------------------------------------------------------------------- Successful Queries: 0 Page Summary Page Hits TTFB Avg TTLB Avg Auth Query ================================================================================ GET /WebMemCache/memcache.aspx 2696 1.94 1.95 No No Nomemcache.aspx的測試報告: Overview ================================================================================ Report name: 2009-7-20 10:54:01 Run on: 2009-7-20 10:54:01 Run length: 00:01:12 Web Application Stress Tool Version:1.1.293.1 Number of test clients: 1 Number of hits: 2577 Requests per Second: 42.95 Socket Statistics -------------------------------------------------------------------------------- Socket Connects: 2860 Total Bytes Sent (in KB): 589.32 Bytes Sent Rate (in KB/s): 9.82 Total Bytes Recv (in KB): 1932.75 Bytes Recv Rate (in KB/s): 32.21 Socket Errors -------------------------------------------------------------------------------- Connect: 0 Send: 0 Recv: 0 Timeouts: 0 RDS Results -------------------------------------------------------------------------------- Successful Queries: 0 Page Summary Page Hits TTFB Avg TTLB Avg Auth Query ================================================================================ GET /WebMemCache/nomemcache.aspx 2577 4.75 4.79 No No 從測試報告上看出memcache.aspx頁面在一分鐘內的Hits(命中次數)2696,平均TTFB是(Total Time to First Byte)1.94,平均TTLB(Total Time to Last Byte)是1.95。這些參數都低于nomemcache.aspx。另外memcache.aspx的Requests per Second(每秒請求的次數)是 44.93高于nomemcache.aspx頁面的42.95.這些參數都說明memcache.aspx頁面的執行性能要高于nomemcache.aspx頁面。緩存起到了提高性能的作用。當然我這里面進行的測試只是模擬500個用戶在1分鐘內的訪問對Web服務器性能的影響。 總結 本文簡單介紹了Memcached的基本原理,特點以及工作方式,接下來介紹了Windows下Memcached服務器端程序的安裝方法、在.NET應用程序中使用.NET memcached client library。接下來通過運行分析程序來了解memcached的工作原理機制,最后通過壓力測試工具對沒有加入Memcached機制的頁面和加入Memcached頁面進行了壓力測試,對比加入Memcached機制前后Web應用程序的性能。了解Memcached內部構造, 就能知道如何在應用程序中使用memcached才能使Web應用的速度更上一層樓。提升web應用程序的性能和訪問速度。 |
轉載于:https://www.cnblogs.com/hsapphire/archive/2009/12/25/1632179.html
總結
以上是生活随笔為你收集整理的.NET下实现分布式缓存系统Memcached的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【会议】2009-11-13
- 下一篇: 老舍 - 婆婆话