MySQL 5.1+ 支援觸發器與 UDF(User Defined Function)。結合 libmemcached 與 Memcached Functions for MySQL,可在資料異動時自動同步快取,實現「資料庫為主、快取為輔」的強一致性架構。
yum install memcached / apt install memcached,啟動 memcached -d -m 256 -p 11211。wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
tar zxf ... && cd ...
./configure && make && make install
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
mysql -u root -p < memcached_functions_mysql/sql/install_functions.sql
# 或執行 perl 腳本
perl memcached_functions_mysql/utils/install.pl
| 函數 | 用途 |
|---|---|
memc_servers_set('host:port') | 設定 Memcached 叢集 |
memc_set('key', 'value') | 設定快取 |
memc_get('key') | 讀取快取 |
memc_increment('key') | 原子遞增(生成 ID) |
memc_delete('key') | 刪除快取 |
-- 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 觸發器
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;
SIGNAL SQLSTATE '45000' 回滾寫入,或記錄日誌異步重試。memc_servers_set('host1:port,host2:port') 支援多節點。觸發器+UDF 方案適合中小規模、強一致性要求高、技術棧純 MySQL+Memcached 的場景。