利用 MySQL UDF (User Defined Function) 在資料庫層直接操作 Memcached,實現寫入即同步,避免應用層雙寫不一致。本文記錄經驗證的版本組合安裝流程、UDF 註冊、觸發器同步架構與 PHP 壓測數據。
| memcached_functions_mysql | 相容 libmemcached | 不相容版本 |
|---|---|---|
| 1.1 | 無 | 0.49, 0.48, 0.47, 0.30, 0.43, 0.42 |
| 0.10 | 無 | 0.42 |
| 0.9 | 0.34 ✅ | 0.49, 0.48, 0.47, 0.44, 0.43, 0.42 |
| 0.8 | 無 | 0.49, 0.48, 0.47, 0.44, 0.43, 0.42 |
結論: 唯一經測試穩定組合為 libmemcached-0.34 + memcached_functions_mysql-0.9(MySQL 5.1.55, CentOS 5.4 64bit, 2GB RAM)。
tar zxvf libmemcached-0.34.tar.gz
cd libmemcached-0.34
./configure --with-memcached=/home/memcache/bin/memcached
make && make install
ln -s /usr/local/lib/libmemcached.so.3 /usr/lib/ # 解決運行時找不到庫
memstat # 驗證安裝成功
tar zxvf memcached_functions_mysql-0.9.tar.gz
cd memcached_functions_mysql-0.9
./configure --with-mysql=/usr/local/mysql/bin/mysql_config --libdir=/usr/local/mysql/lib/
make && make install
mysql> SHOW VARIABLES LIKE '%plugin%';
-- 確認 plugin_dir,假設為 /usr/local/mysql/lib/mysql/plugin/
cp /usr/local/mysql/lib/libmemcached_functions_mysql.so /usr/local/mysql/lib/mysql/plugin/
mysql> SOURCE /path/to/memcached_functions_mysql-0.9/sql/install_functions.sql;
-- 驗證版本
mysql> SELECT memc_udf_version(); -- 0.9
mysql> SELECT memc_libmemcached_version(); -- 0.34
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig
CREATE TABLE `mytable` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`addtime` INT NOT NULL,
`title` VARCHAR(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
DELIMITER $$
CREATE TRIGGER `mytable_insert` AFTER INSERT ON `mytable`
FOR EACH ROW BEGIN
SET @result = http_put(CONCAT('https://192.168.0.134/mem_sync.php?type=post&id=', NEW.id, '&data=', NEW.addtime), 11);
END$$
DELIMITER ;
http_put 由 mysql-udf-http 提供(另一 UDF)。mem_sync.php 解析參數,操作 Memcached (set/replace/delete/get)。| 操作 | 直連 MySQL (1000筆) | 直連 Memcached (1000筆) | 觸發器同步 (1000筆) |
|---|---|---|---|
| INSERT | 0.9 秒 | 0.8 秒 | 9 秒 |
| DELETE | - | - | 1.55 秒 (僅 MySQL) |
tmp_mytable,觸發器改為 INSERT INTO tmp_mytable ... → 耗時 0.7 秒。http_put UDF (網路 HTTP 呼叫)**,而非觸發器本身。libmemcached 原生),移除 HTTP/PHP 層。memcached_functions_mysql 內建 memc_set()、memc_get() 等 UDF 直接操作 Memcached。UDF 同步 Memcached 理論誘人,但 **HTTP 橋接方式效能不可用**。若必須資料庫層同步,請直接使用 memcached_functions_mysql 原生 Memcached UDF 或引入異步佇列中間件。