在 ASP.NET 環境下使用 Memcached 快速上手指南

之前一直想研究 Memcached,這幾天花了些時間研究 Memcached Providers 好讓我現有的 ASP.NET 專案能解決多台主機間快取不同步的狀況, 想不到花沒多少時間就上手了,也因此做了一些記錄。

安裝 Memcached (ver 1.4.4) for Win32

1. 下載 memcached 1.4.4 Windows 32-bit binarymemcached Windows 64-bit pre-release

2. 在 C:\Program Files 建立一個 memcached 目錄

3. 將下載的壓縮檔解壓縮至 C:\Program Files\memcached 目錄

4. 開啟命令提示字元

5. 將 memcached 註冊進 Windows 服務

"C:\Program Files\memcached\memcached.exe" -d install

6. 啟動 memcached 服務

"C:\Program Files\memcached\memcached.exe" -d start

 

移除 Memcached (ver 1.4.4) for Win32

1. 開啟命令提示字元

2. 停止 memcached 服務

"C:\Program Files\memcached\memcached.exe" -d stop

3. 將 memcached 服務從 Windows 服務中移除

"C:\Program Files\memcached\memcached.exe" -d uninstall

4. 移除 C:\Program Files\memcached 目錄

 

測試 memcached 是否正常運作

1. 透過 telnet 指令連接到 localhost 的 11211 port, 其中 Port 11211 為 memcached 預設的 Listen Port,如果有開啟防火牆記得要設定才能讓遠端連接。( 預設會 Listen 所有 interface )

telnet localhost 11211

2. 輸入 stats 指令,並按下 Enter 取得目前 memcached 服務的運作狀態,有資料就代表安裝成功了

3. 輸入 quit 指令,並按下 Enter 退出

備註:完整指令請參考 memcached protocol

 

設定 ASP.NET 專案

1. 下載 Memcached Providers 組件 ==>  Memcached Providers 1.2 (.NET 3.5)

2. 將以下組件複製到 ASP.NET 網站的 bin 目錄下,或透過 加入參考(Add Reference) 方式將加入專案

  • Enyim.Caching.dll
  • Enyim.Caching.pdb
  • MemcachedProviders.dll
  • MemcachedProviders.pdb

 

設定 Memcached Cached Provider 並註冊至 web.config

1. 在 <configSections> 區段加入以下定義

<!-- Memcached -->
<section name="cacheProvider"
type="MemcachedProviders.Cache.CacheProviderSection, MemcachedProviders"
allowDefinition="MachineToApplication" restartOnExternalChanges="true"/>

<sectionGroup name="enyim.com">
<section name="memcached"
type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />
</sectionGroup>

2. 然後在 <appSettings> 之上加入以下定義

<enyim.com>
<memcached>
<servers>
<add address="127.0.0.1" port="11211" />
</servers>
<socketPool minPoolSize="10" maxPoolSize="100"
connectionTimeout="00:00:10" deadTimeout="00:02:00" />
</memcached>
</enyim.com>
<cacheProvider defaultProvider="MemcachedCacheProvider">
<providers>
<add name="MemcachedCacheProvider"
type="MemcachedProviders.Cache.MemcachedCacheProvider, MemcachedProviders"
keySuffix="_MyProjectName_" defaultExpireTime="2000"/>
</providers>
</cacheProvider>

 

開始使用 memcached 的 API

1. 匯入 MemcachedProviders.Cache 命名空間

using MemcachedProviders.Cache;

2. 取得 Cache 項目

object objCache = DistCache.Get(cacheKey);

3. 寫入 Cache 項目

// 寫入快取資料 (預設過期時間)
DistCache.Add(cacheKey, cacheValue);
// 快取 60 秒
DistCache.Add(cacheKey, cacheValue, 60 * 1000);
// 快取至今天結束
DistCache.Add(cacheKey, cacheValue, DateTime.Today.AddDays(1) - DateTime.Now);

4. 移除 Cache 項目

DistCache.Remove(cacheKey);

5. 移除所有 Cache 項目

DistCache.RemoveAll();

 

心得總結 (優點)

  • 架構簡單、容易上手
  • API 與 ASP.NET 快取機制類似,將現有的 HttpRuntime.Cache 替換成 DisCache 也很容易,像我大約只花半天就將一個不小的專案從 ASP.NET 快取轉移至 memcached 快取
  • 安裝部署容易
  • 很容易擴充記憶體快取的總量,增加 memcached 伺服器並修改 web.config 即可!
  • 超高效能,同時支援 TCP 與 UDP 協定
  • 跨平台、跨語言、開放協定、開放原始碼、許多大網站都使用 memcached
  • 內建提供 Session Provider

心得總結 (缺點)

  • 無法取得所有快取項目,用 ASP.NET 快取可以透過 Cache.GetEnumerator() 取得所有快取項目 ( 參考: ASP.NET 如何將目前的 Cache 物件全部清空 ),但在 memcached 完全沒辦法,因為 memcached protocol 根本沒有定義這個功能,除非你自行實做。
  • 網路上可下載的 memcached 版本都不支援 高可用性(High Availability; HA) 特性
  • AppFabric Caching (Velocity) 相比功能少很多
  • 缺乏中文資源、文件少、中文社群不積極、有 Bug 不見得有人理 (還好是開源碼可以自己改)

 

相關連結

  

此文章由 will 發表於 2010/1/27 下午 09:09:01

永久連結 | 評論 (9) | 此文章的RSSRSS comment feed |

分類: ASP.NET | ASP.NET MVC | .Net

標籤: , , , ,

收藏:

相關文章

評論

一月 28. 2010 00:02

Maxi

保哥有沒有研究memcached server farm怎樣架?
他文件好像沒提到...只說是自動的...

Maxi tw

一月 28. 2010 11:39

Will 保哥

Maxi: memcached server 不負責處理 Server Farm 的東西!而是讓 memcached client 決定 cache items 要儲存到哪壹台 memcached 電腦,而這些都是透過 memcached client 的 Hash 演算法決定的,有可能不同的 memcached client 就有不同的演算法。

Will 保哥 tw

一月 28. 2010 16:58

chainchung

請問如何切割 memcache 才是最適合的? 例如: Server 共有 16G, 切 1 個 12G 還是 6 個 2G 較好?

chainchung tw

一月 28. 2010 17:06

Will 保哥

chainchung: 我覺得沒什麼好切的,如果你用專屬伺服器來跑 memcached 就啟動一個服務(daemon)即可。

Will 保哥 tw

一月 29. 2010 09:35

chainchung

以 1 台 32G 的 server 為例, 若 cache 給 28G, 當 service crash 掉, 所有的 request 會直接 touch 到 SQL, 造成一個瓶頸?

chainchung tw

一月 29. 2010 11:19

ChrisTorng

今天看到 Extensible Output Caching with ASP.NET 4 (VS 2010 and .NET 4.0 Series) weblogs.asp.net/.../...010-and-net-4-0-series.aspx
說 ASP.NET 4 Output Cache Extensibility 可以支援 memcached,不曉得跟這裡所說的方法有多少差別...

ChrisTorng tw

一月 29. 2010 12:47

Will 保哥

ChrisTorng: 我這篇文章沒有提到 Outpu Cache,但若要讓 ASP.NET 4 支援 Output Cache 儲存在 memcached 會比現在的版本還容易實作!

Will 保哥 tw

一月 29. 2010 12:49

Will 保哥

chainchung: 你的前提是 memcached 服務不穩定的情況,但事實上應該沒那麼容易掛。當 memcached service crash 掉,所有的 request 會直接 touch 到 SQL 而造成瓶頸是一定的,你自然要依照你現有環境進行佈署規劃。

Will 保哥 tw

二月 5. 2010 10:12

項建

這個版本的Memcached可以使用-I 修改max size item參數嗎?我是這麼使用的,沒什麼效果。Memcached在windows上可以改max size item嗎?

項建

新增評論


(將顯示您的Gravatar圖示)  

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]



線上預覽

三月 12. 2010 21:37