使用Memcached提高.NET应用程序的性能
在應用程序運行的過程中總會有一些經常需要訪問并且變化不頻繁的數據,如果每次獲取這些數據都需要從數據庫或者外部文件系統中去讀取,性能肯定會受到影響,所以通常的做法就是將這部分數據緩存起來,只要數據沒有發生變化每次獲取這些數據的時候直接從內存中區獲取性能肯定會大大地提高。在.NET中提供了一個Cache類可以實現這些功能。在ASP.NET中可以通過HttpContext 對象的 Cache 屬性或 Page 對象的 Cache 屬性來獲取這個類的實例。 在大部分情況下我們都可以使用Cache類來提高ASP.NET的性能,但是使用Cache類也有一些不足,比如我們不能指定Cache類所占用的內存的大小,此外在Cache中緩存的數據沒有辦法被另一臺機器上的應用程序直接訪問,因此在本文中提出另一種數據緩存方案,那就是使用分布式緩存。分布式緩存的特點是緩存的數據不必和應用程序在同一臺機器上,從而大大增強了緩存數據的復用性。在本文介紹如何在.NET應用中使用Memcache作為分布式緩存。Memcached介紹Memcached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 為首開發的一款軟件。在通常的應用中我們都會將數據保存到數據庫中,每次需要的時候都會從數據庫去查詢這些數據,如果應用程序的用戶很多就會出現大量并發訪問數據庫的情況,這樣就會增加應用程序的響應時間,使用Memcached就可以有效解決這個問題。memcached是高性能的分布式內存緩存服務器。一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴展性。像大名鼎鼎的Facebook網站就使用了Memcached。周公稍后會提供Windows平臺上32位和64位的Memcached程序。
為了提高性能,Memcached中的數據都保存在Memcached內置的存儲空間中。因為當Memcached重啟會導致其中的數據全部丟失,所以一般的方案是將數據保存在數據庫中,每次請求數據的時候先查看在Memcached有沒有緩存,如果有就直接從緩存中取出數據;如果沒有,就從數據庫中取出數據返回給應用程序并將請求的數據緩存到Memcached中,這樣一來下次請求相同的數據就可以直接從Memcached中讀取而不用再去查數據庫了;一旦對數據有更新,同時更新數據庫和Memcached。
Memcached是一個命令行窗口程序,可以在命令行窗口中啟動也可以封裝在系統服務中啟動。在啟動Memcached時需要提供一些必須的參數,指定Memcached運行時監聽的端口和最大使用的內存大小等。如果緩存的數據大小超過指定內存,那么Memcached就會按照LRU(Least Recently Used)算法自動“刪除”不使用的緩存(標記為失效),新增的緩存數據就可以使用這些標記為失效的數據所占用的內存,這樣就不用擔心Memcached超出所指定內存的問題。此外,為了提高性能,在緩存數據過期后Memcached并不是從物理內存中刪除緩存的數據,僅僅在取出改數據的時候檢查它是否已經過了有效期。
目前有多種平臺的Memcached版本,比如Linux、FreeBSD、Solaris (memcached 1.2.5以上版本)、Mac OS X及Windows平臺,在Windows平臺上還有32位和64位版本。
Memcached有一套協議,利用這套協議可以對Memcached進行數據存取和查看Memcached的狀態,很多程序語言都依據這套協議來操作Memcached,比如PHP、Java、C、C++及C#等。
獲取了對應平臺的Memcached版本就可以運行Memcached了。在這里僅以Windows平臺上的32位Memcached為例。
運行Memcached:
memcached.exe -p 11121 -m 64
上面的命令是運行Memcached,指定它的監聽端口是11121(這是它的默認端口,可以指定為其它大于1024的端口,因為小于1024的端口已經有了默認指定),最大使用內存為64m,如果啟用了Windows防火墻,切記要在防火墻上打開這個端口。
在調試程序時可以使用下面的命令行來運行:
memcached.exe -p 11121 -m 64 -vv
這樣就會看到如下的結果:
slab class?? 1: chunk size???? 88 perslab 11915
slab class?? 2: chunk size??? 112 perslab? 9362
slab class?? 3: chunk size??? 144 perslab? 7281
slab class?? 4: chunk size??? 184 perslab? 5698
slab class?? 5: chunk size??? 232 perslab? 4519
slab class?? 6: chunk size??? 296 perslab? 3542
slab class?? 7: chunk size??? 376 perslab? 2788
slab class?? 8: chunk size??? 472 perslab? 2221
slab class?? 9: chunk size??? 592 perslab? 1771
slab class? 10: chunk size??? 744 perslab? 1409
slab class? 11: chunk size??? 936 perslab? 1120
slab class? 12: chunk size?? 1176 perslab?? 891
slab class? 13: chunk size?? 1472 perslab?? 712
slab class? 14: chunk size?? 1840 perslab?? 569
slab class? 15: chunk size?? 2304 perslab?? 455
slab class? 16: chunk size?? 2880 perslab?? 364
slab class? 17: chunk size?? 3600 perslab?? 291
slab class? 18: chunk size?? 4504 perslab?? 232
slab class? 19: chunk size?? 5632 perslab?? 186
slab class? 20: chunk size?? 7040 perslab?? 148
slab class? 21: chunk size?? 8800 perslab?? 119
slab class? 22: chunk size? 11000 perslab??? 95
slab class? 23: chunk size? 13752 perslab??? 76
slab class? 24: chunk size? 17192 perslab??? 60
slab class? 25: chunk size? 21496 perslab??? 48
slab class? 26: chunk size? 26872 perslab??? 39
slab class? 27: chunk size? 33592 perslab??? 31
slab class? 28: chunk size? 41992 perslab??? 24
slab class? 29: chunk size? 52496 perslab??? 19
slab class? 30: chunk size? 65624 perslab??? 15
slab class? 31: chunk size? 82032 perslab??? 12
slab class? 32: chunk size 102544 perslab??? 10
slab class? 33: chunk size 128184 perslab???? 8
slab class? 34: chunk size 160232 perslab???? 6
slab class? 35: chunk size 200296 perslab???? 5
slab class? 36: chunk size 250376 perslab???? 4
slab class? 37: chunk size 312976 perslab???? 3
slab class? 38: chunk size 391224 perslab???? 2
slab class? 39: chunk size 489032 perslab???? 2
<96 server listening
<112 server listening
<116 send buffer was 8192, now 268435456
<116 server listening (udp)
在客戶端還可以通過telnet來查看和操作Memcached,前提是服務器端和客戶端都支持Telnet協議,在Windows7和Windows2008中默認都不支持,需要在控制面板中安裝和啟用。
首先打開控制面板,然后點擊“打開或關閉Windows功能”,如下圖所示:
點擊“打開或關閉Windows功能”之后會看到當前系統啟用的功能的狀態,根據當前機器選擇打開Telnet服務器端或者客戶端功能,如下圖所示:
?
經過上面的操作之后就可以在客服端遠程查看Memcached的狀態或者操作Memcached了。下面的命令就是連接到Memcached:
telnet localhost 11121
連接之后會出現一個命令行窗口,在這個命令行窗口中輸入"stats"就可以看到當前Memcached的狀態,如下就是剛剛啟動的Memcached的狀態數據:
STAT pid 852
STAT uptime 1399
STAT time 1300979378
STAT version 1.2.5
STAT pointer_size 32
STAT curr_items 0
STAT total_items 0
STAT bytes 0
STAT curr_connections 3
STAT total_connections 5
STAT connection_structures 4
STAT cmd_get 0
STAT cmd_set 0
STAT get_hits 0
STAT get_misses 0
STAT evictions 0
STAT bytes_read 23
STAT bytes_written 415
STAT limit_maxbytes 67108864
STAT threads 1
END
通過這個數據我們就可以了解Memcached的狀態了。
這些數據所代表的意義如下:
pid:32u,服務器進程ID。?
uptime:32u, 服務器運行時間,單位秒。?
time :32u, 服務器當前的UNIX時間。
version :string, 服務器的版本號。?
curr_items :32u, 服務器當前存儲的內容數量 Current number of items stored by the server?
total_items :32u, 服務器啟動以來存儲過的內容總數。
bytes :64u, 服務器當前存儲內容所占用的字節數。
curr_connections :32u, 連接數量。?
total_connections :32u, 服務器運行以來接受的連接總數。
connection_structures:32u, 服務器分配的連接結構的數量。?
cmd_get :32u, 取回請求總數。?
cmd_set :32u, 存儲請求總數。?
get_hits :32u, 請求成功的總次數。
get_misses :32u, 請求失敗的總次數。
bytes_read :64u, 服務器從網絡讀取到的總字節數。
bytes_written :64u, 服務器向網絡發送的總字節數。
limit_maxbytes :32u, 服務器在存儲時被允許使用的字節總數。
上面的描述中32u和64u表示32位和64位無符號整數,string表示是string類型數據。
在.NET中應用Memcached有很多.NET版本的Memcached客戶端程序,在這里周公使用的Enyim Memcached,可以到https://github.com/enyim/EnyimMemcached/下載最新的版本。
要想在項目中使用Memcached,需要添加對Enyim.Caching.dll的應用。除此之外,我們可能還需要在config文件中配置Memcached的信息(也可以在程序代碼中指定,但那樣不靈活),如下就是一個config文件配置的例子:
如果我們配置了多個Memcached的實例,可以想上面的注釋部分那樣在<servers>節點下添加多個Memcached的實例配置。
這里需要說明的是如果我們需要向Memcached中添加自定義數據類型時,我們需要將該數據類型添加上[Serializable]標記。
下面是一個Enyim Memcached的例子:
說明:如果需要一次從Memcached中取回多個緩存的數據,可以參考MultiGetDemo()方法,這樣一來只需要一次網絡通訊就可以取回全部數據,減少網絡連接時間。此外,在Memcached客戶端可以使用Text或者Binary協議,經過周公千萬次測試比較,使用Binary協議性能略高于使用Text協議。在上面的config文件中周公就配置使用了Binary協議。
總結,使用Memcached這樣的分布式緩存可以大大提高應用程序的性能,經過周公測試,正確使用Memcached可以將單臺服務器的并發訪問數從20提高到1000左右,也就是提高了50倍,這是一個相當客觀的提升!限于篇幅,關于Memcached的更深更詳細的用法沒有在本篇介紹,此文算作拋磚引玉,讀者可以自行參考其它相關資料。
總結
以上是生活随笔為你收集整理的使用Memcached提高.NET应用程序的性能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纳智捷大7怎么样 深度评测纳智捷大7的性
- 下一篇: 郭亮村私家车能开上去吗