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

MySQL 觸發器 + UDF 實現 Memcached 自動同步更新架構實戰

     編輯:MySQL 資料庫相關知識

架構總覽

MySQL 5.1+ 支援觸發器與 UDF(User Defined Function)。結合 libmemcached 與 Memcached Functions for MySQL,可在資料異動時自動同步快取,實現「資料庫為主、快取為輔」的強一致性架構。

元件安裝步驟

  1. Memcached Server:yum install memcached / apt install memcached,啟動 memcached -d -m 256 -p 11211。
  2. MySQL Server 5.1+:標準安裝。
  3. libmemcached:
    wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
    tar zxf ... && cd ...
    ./configure && make && make install
  4. Memcached Functions for MySQL:
    wget https://download.tangent.org/memcached_functions_mysql-1.1.tar.gz
    tar zxf ... && cd ...
    ./configure --with-mysql=/usr/local/mysql/bin/mysql_config --libdir=/usr/local/mysql/lib/mysql/
    make && make install
  5. 註冊 UDF 到 MySQL:
    mysql -u root -p < memcached_functions_mysql/sql/install_functions.sql
    # 或執行 perl 腳本
    perl memcached_functions_mysql/utils/install.pl

核心 UDF 函數

函數用途
memc_servers_set('host:port')設定 Memcached 叢集
memc_set('key', 'value')設定快取
memc_get('key')讀取快取
memc_increment('key')原子遞增(生成 ID)
memc_delete('key')刪除快取

觸發器實戰:URL 短網址服務自動同步

-- 1. 建表
CREATE TABLE urls (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    url VARCHAR(255) NOT NULL
) ENGINE=InnoDB;

-- 2. 初始化快取序列
SELECT memc_servers_set('localhost:11211');
SELECT memc_set('urls:sequence', 0);

-- 3. 建立 INSERT 觸發器
DELIMITER $$
CREATE TRIGGER url_mem_insert
BEFORE INSERT ON urls
FOR EACH ROW
BEGIN
    -- 從快取取得下一個 ID
    SET NEW.id = memc_increment('urls:sequence');
    -- 同步寫入快取:key=urls:id, value=url
    SET @dummy = memc_set(CONCAT('urls:', NEW.id), NEW.url);
END$$
DELIMITER ;

-- 4. 測試插入
INSERT INTO urls (url) VALUES ('https://google.com'), ('https://github.com');

-- 5. 驗證快取
SELECT memc_get('urls:1');  -- https://google.com
SELECT memc_get('urls:2');  -- https://github.com
SELECT * FROM urls;         -- 對應 id 1,2

擴充:UPDATE/DELETE 同步

-- UPDATE 觸發器
CREATE TRIGGER url_mem_update
AFTER UPDATE ON urls
FOR EACH ROW
BEGIN
    IF NEW.url <> OLD.url THEN
        SET @dummy = memc_set(CONCAT('urls:', NEW.id), NEW.url);
    END IF;
END;

-- DELETE 觸發器
CREATE TRIGGER url_mem_delete
AFTER DELETE ON urls
FOR EACH ROW
BEGIN
    SET @dummy = memc_delete(CONCAT('urls:', OLD.id));
END;

關鍵優勢與注意事項

  • 強一致性:資料庫寫入成功 ⇔ 快取更新成功(同一交易)。
  • 效能:UDF 為 C 實現,開銷極低(微秒級)。
  • 故障處理:Memcached 掛掉時 UDF 返回 NULL/錯誤,觸發器可選擇 SIGNAL SQLSTATE '45000' 回滾寫入,或記錄日誌異步重試。
  • 叢集:memc_servers_set('host1:port,host2:port') 支援多節點。
  • 版本相容:MySQL 5.7/8.0 需重新編譯 UDF(API 變更),或改用應用層雙寫/訂閱 Binlog(Canal/Maxwell)。

觸發器+UDF 方案適合中小規模、強一致性要求高、技術棧純 MySQL+Memcached 的場景。

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