The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

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

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

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

  1. Poll_投票結果
  2. Poll_題目資料

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

最後,我用以下兩種方式解決:

1. 修改 Memcached Provider 的原始碼,讓 DefaultKeyTransformer.cs 能夠正確處理 UTF8 文字

    修改過的原始碼已經放上 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>

相關連結