﻿# 解決 Memcached Provider 不支援中文 Cache Key 的問題

前陣子使用 [Memcached](http://memcached.org/) 當成我們某個 ASP.NET 網站的後端，但只要遇到採用 Non-ASCII 的文字當成快取的鍵值(Key)就會自動消失，經過一番研究後確認是 [Memcached Provider](https://github.com/friism/Memcached-Providers) 的 DefaultKeyTransformer 在處理所有 memcached 通訊協定時所有的 Key 都是以 [Encoding.ASCII](http://msdn.microsoft.com/en-us/library/system.text.encoding.ascii.aspx) 做為文字編碼，以致於所有中文字都無法讀取而自動被忽略，而也在編譯時與執行時期都不會出現任何錯誤，因此必須特別小心。

舉個簡單例子，假設我們有兩個 Cache Key 分別為：

1.  Poll\_投票結果
2.  Poll\_題目資料

而實際儲存到 memcached 中的 Cache Key 將會是 Poll\_ 而已，由於遇到轉型失敗的快取物件都會預設為 null，因此可能會讓你在執行時期也不會發生問題，只是快取機制無法運作導致效能減低而已。

最後，我用以下兩種方式解決：

**1\. 修改** [**Memcached Provider**](https://github.com/friism/Memcached-Providers) **的原始碼，讓 DefaultKeyTransformer.cs 能夠正確處理 UTF8 文字**

    [修改過的原始碼](https://web.archive.org/web/20090314205740/http://memcachedproviders.codeplex.com:80/SourceControl/PatchList.aspx)已經放上 CodePlex，有興趣的人可以去下載並重新編譯。

    但請注意我上傳了兩個版本：

-   針對目前線上可下載的 Memcached Providers 1.2 在原始碼那邊的 Changeset 是 13951，你應該要先取出 Changeset 13951 的原始碼，再套用 Patch ID = 5104 的修補檔才能編譯出跟 Memcached Providers 1.2 相容的組件！
-   另一個 Patch ID = 5099 就是原始碼最新版 (Changeset 29520) 的修補檔。

**2\. 選用其他 KeyTransformer 即可正確處理 Cache Key 文字無法轉換的問題**

    切換不同的 KeyTransformer 可以參考以下設定，只要修改 web.config 即可：

```
<enyim.com>   <memcached     keyTransformer="Enyim.Caching.Memcached.SHA1KeyTransformer, Enyim.Caching">     <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>
```

**相關連結**

-   [memcached - a distributed memory object caching system](http://memcached.org/)
-   [Memcached Providers](https://github.com/friism/Memcached-Providers)
-   [在 ASP.NET 環境下使用 Memcached 快速上手指南](/post/2010/01/27/Memcached-for-ASPNET-Quick-Start-Guide)
