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

之前一直想研究 [Memcached](http://memcached.org/)，這幾天花了些時間研究 [Memcached Providers](https://github.com/friism/Memcached-Providers) 好讓我現有的 ASP.NET 專案能解決多台主機間快取不同步的狀況， 想不到花沒多少時間就上手了，也因此做了一些記錄。

**安裝 Memcached (ver 1.4.4) for Win32**

1\. 下載 memcached 1.4.4 Windows 32-bit binary 或 [memcached Windows 64-bit pre-release](https://web.archive.org/web/20100924012403/http://blog.northscale.com:80/northscale-blog/2009/12/memcached-windows-64-bit-pre-release-available.html)

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 服務的運作狀態，有資料就代表安裝成功了

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/1c8991df97e8add0d880-image.png)

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

**備註**：完整指令請參考 [memcached protocol](http://www.google.com/search?hl=zh-TW&source=hp&esrch=BetaShortcuts&q=memcached+protocol&lr=&aq=0&oq=memcached+proto)

**設定 ASP.NET 專案**

1\. 下載 [Memcached Providers](https://github.com/friism/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 物件全部清空](/post/2008/04/11/How-to-clear-all-cache-items-in-ASPNET) )，但在 memcached 完全沒辦法，因為 [memcached protocol](http://www.google.com/search?hl=zh-TW&source=hp&esrch=BetaShortcuts&q=memcached+protocol&lr=&aq=0&oq=memcached+proto) 根本沒有定義這個功能，除非你自行實做。
-   網路上可下載的 memcached 版本都不支援 **高可用性**(High Availability; HA) 特性
-   與 [AppFabric Caching (Velocity)](http://msdn.microsoft.com/appfabric) 相比功能少很多
-   缺乏中文資源、文件少、中文社群不積極、有 Bug 不見得有人理 (還好是開源碼可以自己改)

**相關連結**

-   [memcached - a distributed memory object caching system](http://memcached.org/)
-   [Memcached Providers](https://github.com/friism/Memcached-Providers)
-   [Implementing distributed caching using Memcached](http://www.codeproject.com/KB/web-cache/Memcached.aspx)
