將 Memcached 協議直接映射到 InnoDB 表,實現:
get/set 代碼**無需修改**即可切換到 MySQL 後端。shell> groupadd mysql shell> useradd -r -g mysql mysql shell> tar zxvf mysql-5.6.13.tar.gz shell> cd mysql-5.6.13 shell> cmake . -DWITH_INNODB_MEMCACHED=ON shell> make && make install shell> cd /usr/local/mysql shell> chown -R mysql . && chgrp -R mysql . shell> scripts/mysql_install_db --user=mysql shell> chown -R root . && chown -R mysql data shell> bin/mysqld_safe --user=mysql & shell> cp support-files/mysql.server /etc/init.d/mysql.server
關鍵: -DWITH_INNODB_MEMCACHED=ON 編譯期啟用,運行時才能 INSTALL PLUGIN。
mysql> SOURCE /usr/local/mysql/share/innodb_memcached_config.sql;
建立庫 innodb_memcache 及三張表:
cache_policies:緩存策略(innodb_only/cache_only/caching)config_options:分隔符配置(separator、table_map_delimiter)containers:表映射規則(核心)mysql> INSTALL PLUGIN daemon_memcached SONAME "libmemcached.so"; mysql> UNINSTALL PLUGIN daemon_memcached; -- 修改配置後需重裝生效
mysql> SHOW VARIABLES LIKE '%memcached%'; +----------------------------------+------------------+ | Variable_name | Value | +----------------------------------+------------------+ | daemon_memcached_enable_binlog | OFF | | daemon_memcached_engine_lib_name | innodb_engine.so | | daemon_memcached_engine_lib_path | | | daemon_memcached_option | | | daemon_memcached_r_batch_size | 1 | | daemon_memcached_w_batch_size | 1 | +----------------------------------+------------------+
性能關鍵: r_batch_size/w_batch_size 控制讀/寫批次提交頻率。預設 1(每次提交),高併發寫入建議調大(如 100),以換取吞吐,犧牲極端情況下的少量數據風險。
USE test;
CREATE TABLE users (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
username VARCHAR(15) NOT NULL,
password VARCHAR(32) NOT NULL,
email TEXT NOT NULL,
flags INT UNSIGNED DEFAULT 0,
cas_column BIGINT UNSIGNED DEFAULT 0,
expire_time_column INT UNSIGNED DEFAULT 0,
PRIMARY KEY (id),
UNIQUE KEY username (username)
) ENGINE=InnoDB;
INSERT INTO users (username, password, email) VALUES
('foo', 'ffffffffffffffffffffffffffffffff', 'foo@domain.com'),
('bar', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', 'bar@domain.com');
INSERT INTO innodb_memcache.containers
(name, db_schema, db_table, key_columns, value_columns, flags, cas_column, expire_time_column, unique_idx_name_on_key)
VALUES
('default', 'test', 'users', 'username', 'password|email', 'flags', 'cas_column', 'expire_time_column', 'username');
name='default':客戶端無需指定 @@default.key,直接 get foo 即可。value_columns='password|email':多欄位用 | 分隔(可在 config_options 修改分隔符)。shell> echo "get foo bar" | nc localhost 11211 VALUE foo 0 47 ffffffffffffffffffffffffffffffff|foo@domain.com VALUE bar 0 47 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|bar@domain.com END
| 限制項 | 要求 | 備註 |
|---|---|---|
| key_columns 類型 | CHAR/VARCHAR,長度 ≤ 250 | Memcached 協議鍵長限制 |
| value_columns 類型 | CHAR/VARCHAR/BLOB,長度不限 | 大字段建議 BLOB |
| cas_column 類型 | BIGINT UNSIGNED | 樂觀鎖版本號 |
| expire_time_column 類型 | INT UNSIGNED | 秒級過期時間,0=永不過期 |
| flags 類型 | INT | 用戶自定義標記 |
| 必須字段 | 上述 5 欄位**全需存在** | 無對應業務欄位須額外添加,較繁瑣 |
| 不支援 | 多鍵事務、CAS 原子增減、複雜查詢 | 僅適合簡單 KV 讀寫 |
InnoDB Memcached 插件為「需要 Memcached 協議兼容 + 需要持久化/一致性」的場景提供了極佳折中方案。但受限於映射剛性、缺乏豐富查詢,**不建議作為主流業務存儲**,適合:Session 存儲、Token 快取、非核心計數器、配置熱加載等輔助場景。核心交易仍應走標準 SQL + 連接池。