资料不同步: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。