首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL InnoDB Memcached 插件完整教程:安裝、配置、實戰與限制詳解

     編輯:MySQL 綜合教學

一、為什麼要用 InnoDB Memcached 插件?

將 Memcached 協議直接映射到 InnoDB 表,實現:

  • 持久化: 重啟不丟數據,異常宕機自動恢復(WAL + Doublewrite)。
  • 一致性: 支援事務、MVCC、外鍵、主從複寫,讀寫均可強一致。
  • 零代碼遷移: 應用原本用 Memcached 的 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),以換取吞吐,犧牲極端情況下的少量數據風險。

六、容器映射實戰:用戶登錄場景

1. 建表

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;

2. 插入測試數據

INSERT INTO users (username, password, email) VALUES
('foo', 'ffffffffffffffffffffffffffffffff', 'foo@domain.com'),
('bar', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', 'bar@domain.com');

3. 配置 containers 映射

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 修改分隔符)。

4. 命令行驗證

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,長度 ≤ 250Memcached 協議鍵長限制
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 + 連接池。

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