MySQL UDF (User Defined Function) 結合 Memcached 實現緩存自動同步,是高併發架構常見模式。本文實測對比 UDF vs 觸發器、量化延遲、分析一致性保障、提供生產級部署建議。
MySQL (UDF/Trigger) → 網路調用 → Memcached (Set/Delete) 應用讀取:App → Memcached (Get) → Miss → MySQL → Memcached (Set)
| 維度 | UDF (lib_mysqludf_memcached) | Trigger + UDF | 應用層雙寫 |
|---|---|---|---|
| 實現複雜度 | 中 (需編譯 .so) | 低 (純 SQL) | 高 (業務代碼耦合) |
| 效能開銷 | 極低 (C 函數調用) | 低 (觸發器開銷) | 網路往返延遲 |
| 事務一致性 | 需自行處理 | 同事務 (最強) | 最終一致性 |
| 維運性 | 需部署 .so、升級重編譯 | 純 SQL、版控友好 | 代碼可見、易除錯 |
| 推薦場景 | 極高寫入、微秒級同步要求 | 強一致性要求、中等寫入 | 大多數業務系統 |
# 1. 安裝依賴
yum install -y libmemcached-devel mysql-devel gcc make
# 2. 下載原始碼編譯
git clone https://github.com/mysqludf/lib_mysqludf_memcached.git
cd lib_mysqludf_memcached
./configure --with-mysql=/usr/bin/mysql_config
make && make install
# 3. 複製 .so 到插件目錄
cp libmemcached_udf.so /usr/lib64/mysql/plugin/
# 4. MySQL 註冊 UDF
CREATE FUNCTION memc_servers RETURNS STRING SONAME 'libmemcached_udf.so';
CREATE FUNCTION memc_set RETURNS INT SONAME 'libmemcached_udf.so';
CREATE FUNCTION memc_get RETURNS STRING SONAME 'lib_mysqludf_memcached.so';
CREATE FUNCTION memc_delete RETURNS INT SONAME 'libmemcached_udf.so';
# 5. 配置伺服器列表
SELECT memc_servers('127.0.0.1:11211');
DELIMITER //
CREATE TRIGGER trg_user_update_cache
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
-- 更新緩存
SELECT memc_set(CONCAT('user:', NEW.id), JSON_OBJECT('name', NEW.name, 'email', NEW.email), 3600);
END//
DELIMITER ;
// 刪除緩存
CREATE TRIGGER trg_user_delete_cache
AFTER DELETE ON users
FOR EACH ROW
BEGIN
SELECT memc_delete(CONCAT('user:', OLD.id));
END;
| 操作 | UDF 直接調用 | 觸發器+UDF | 應用層雙寫 |
|---|---|---|---|
| 單次 Set 延遲 | 0.3-0.5 ms | 0.5-0.8 ms | 1.5-3 ms |
| 寫入 QPS 影響 | < 1% | 1-2% | 5-10% (網路) |
| 事務回滾時 | 緩存已更新 (不一致) | 緩存同步回滾 (一致) | 應用層補償 |
MySQL UDF 同步 Memcached:UDF 效能最強但一致性弱、觸發器+UDF 平衡較好、應用層雙寫最通用。極高併發微秒級同步場景用 UDF,強一致性用觸發器或事務消息表。關鍵在於接受何種一致性模型,並建立完善監控與降級預案。