以往 MySQL + memcached 的作法是由 application 端「拉」資料後再塞到 memcached 上,這會產生幾個問題:
- 資料不同步:MySQL 上的資料更新了,但 memcached 裡的 cache 因為還沒過期而尚未更新。
- 第一次的 Race Condition:同時有很多 client 向 memcached 要一份目前還不存在的 cache,這時候這些 client 都會跑到 MySQL 要資料再放一份到 memcached 上。
這兩個問題都有在 MySQL UDF + memcached 出來之前都有解法:前者可以在更新 MySQL 時順便更新 memcached 裡的資料;後者可以靠 memcached lock 的技巧避免突然有大量 Query 造成後端 MySQL 負荷過重。這兩個方法需要 application (client) 配合,不是很完美,但在實際應用上還算堪用。(一個很簡單的場景:如果公司內同時使用 PHP 與 Perl,那麼就必須維護這兩個 library)
除了 client 自己推資料到 memcached 上,也有人研究,當 MySQL 上的資料更新時,由 MySQL server 自動到 memcached 上更新資料,也就是把資料「推」到 memcached 上的方法。資料更新時的觸發動作可以用 MySQL Trigger 做到,而寫入到 memcached 的部份透過強者的 libmemcached 處理:Memcached Functions for MySQL。
btw,Jan Kneschke 也用 libmemcache 寫過類似的東西:UDF_LUA 這篇的下方 (「MySQL and memcached」的部份)