首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL UDF 自動同步 Memcached 實戰:libmemcached + memcached_functions_mysql 安裝與效能測試

     編輯:MySQL 資料庫相關知識

利用 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.90.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)。

安裝流程

1. 編譯安裝 libmemcached-0.34

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  # 驗證安裝成功

2. 編譯安裝 memcached_functions_mysql-0.9

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

3. 註冊 UDF 到 MySQL

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

4. 解決 pkg-config 找不到 libmemcached

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;

觸發器:INSERT 後呼叫 HTTP 介面更新 Memcached

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)。
  • 遠端 PHP 腳本 mem_sync.php 解析參數,操作 Memcached (set/replace/delete/get)。

效能測試結果 (PHP 客戶端直連 vs 觸發器同步)

操作直連 MySQL (1000筆)直連 Memcached (1000筆)觸發器同步 (1000筆)
INSERT0.9 秒0.8 秒9 秒
DELETE--1.55 秒 (僅 MySQL)

瓶頸定位

  • 建立臨時表 tmp_mytable,觸發器改為 INSERT INTO tmp_mytable ... → 耗時 0.7 秒。
  • 證明:**效能損耗集中在 http_put UDF (網路 HTTP 呼叫)**,而非觸發器本身。

結論與改良方向

  • 現狀: UDF + HTTP + PHP 同步鏈路過長,**單次同步延遲 ~9ms,吞吐 ~110 ops/s**,難以滿足高併發寫入場景。
  • 優化路徑:
    1. UDF 直接呼叫 Memcached 二進制協議(libmemcached 原生),移除 HTTP/PHP 層。
    2. 或採用 memcached_functions_mysql 內建 memc_set()、memc_get() 等 UDF 直接操作 Memcached。
    3. 異步化:觸發器寫入本地佇列表,獨立 Worker 批次同步 Memcached。
  • 適用場景: 低頻寫入、容忍秒級延遲、無法修改應用代碼的舊系統改造。

UDF 同步 Memcached 理論誘人,但 **HTTP 橋接方式效能不可用**。若必須資料庫層同步,請直接使用 memcached_functions_mysql 原生 Memcached UDF 或引入異步佇列中間件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved