Category Archives: Cache

如何使用 memcached 做快取

關於 memcached,雖然可以找到一些基本
,DK大神也有點到一些進階議題,不過最近看了 Using memcached PDF 之後才真正學到了不少實戰技巧跟如何設計快取的概念。以下是一些零散的筆記:

裝好之後,基本的啟動方式是

*
memcached -l 127.0.0.1 -P 11211 -m 128 -d for deamon
* memcached -l 127.0.0.1 -P 11211 -m 128 -vv for development debug

memcached 是一套 Name-Value Pair(NVP) 分散式記憶體快取系統,Key 的長度被限制在 250 characters,儲存的資料不能超過 1 megabyte。如果資料會超過 1mb,可以考慮使用壓縮工具,例如在 Rails 2.1 裡就內建了 ActiveSupport::Cache::CompressedMemCacheStore。

除了 memcached server,不同程式語言都有自己的 memcache client library 工具提供更方便的介面。一個基本的任務就是使用 Hashing algorithm 根據 Key 來決定該去存取一台 memcached server (如果有超過一台的 memcached server 的話)。Ruby 的 client 目前檯面上有幾套 1. memcache-client 2. fiveruns fork 版 memcache-client,針對 Hasing 的部份用C改寫了 3. 使用 libmemcached 的超快 memcached

有趣的是,不需要 client library,memcached 是可以直接 telnet 127.0.0.1 11211 的。telnet 之後打 stats 可以得到一些統計資料,除了目前共有多少筆資料跟共用多少空間之外,重要的有 cmd_get 跟 cmd_hits,就可以得出 cache hit ratio,這個數字應該努力到九成以上。另外還有你的 cmd_set 應該超過 cmd_get,

其他的 memcached 標準操作有 SET (新增或是更新一個值)、ADD(只有在該key不存在時,才會新增快取資料成功)、REPLACE(只有在該key已經存在時,才會更新資料成功)、GET(拿快取資料)。

在考慮使用 memcached 前,要知道它不是你系統中唯一的 cache,HTML 的整頁快取應該用 Web server、純 SQL query result 可以用 MySQL 內建 Query Cache,設定很簡單,效果很不錯 (Cache Performance Comparison。我自己的心得是很多時候你想要快取的物件其實並不是一個 SQL query 就可以搞定的,而是多個 SQL query 才計算出來,這時候去做純快取 SQL query result 我個人覺得也許不是很有意義,Rails 這部份就有人實做了query_memcached。。

另外要注意的是 memcached 並不是 persistent data store,只要一關掉 memcached server,裡面的資料就會通通不見,如果要拿來儲存 session authentication 資料要特別小心。

寫 memcached 程式的第一個問題是找出什麼資料需要快取? 一個常見的問題是我該快取 HTML fragment 還是純資料結構? 如果你操作介面只有一處用到,我們可以只快取 HTML fragment 即可,不然其實規模稍大的網站其實兩者都可以快取起來。

撰寫使用 memcached 程式的基本模式就是,先查看有沒有 key-value,有就把快取資料讀出來,沒有就運算結果後存到 memcached sever。這部份算是簡單的。真正困難的事情有兩件:一是清除過期的快取資料(expire),二是Key的命名。
Continue reading 如何使用 memcached 做快取