14.21.7 InnoDB memcached 插件内部
InnoDB Memcached 插件的 InnoDB API
InnoDB
memcached 引擎通过InnoDB
API 访问InnoDB
,其中大多数直接从嵌入式InnoDB
中采用。 InnoDB
API 函数作为回调函数传递到InnoDB
memcached 引擎。 InnoDB
API 函数直接访问InnoDB
table,并且大多数都是 DML 操作,但TRUNCATE TABLE除外。
memcached 命令是通过InnoDB
memcached API 实现的。下 table 概述了如何将“ memcached”命令 Map 到 DML 或 DDL 操作。
table14.21 memcached 命令和相关的 DML 或 DDL 操作
memcached Command | DML 或 DDL 操作 |
---|---|
get | 读/取命令 |
set | 搜索后跟一个INSERT 或UPDATE (取决于密钥是否存在) |
add | 搜索后跟着INSERT 或UPDATE |
replace | 搜索后跟着UPDATE |
append | 搜索后跟UPDATE (将数据附加到UPDATE 之前的结果中) |
prepend | 搜索后跟UPDATE (将数据添加到UPDATE 之前的结果中) |
incr | 搜索后跟着UPDATE |
decr | 搜索后跟着UPDATE |
delete | 搜索后跟着DELETE |
flush_all | TRUNCATE TABLE (DDL) |
InnoDB memcached 插件配置 table
本节介绍daemon_memcached
插件使用的配置 table。 cache_policies
table,config_options
table 和containers
table 是由innodb_memcache
数据库中的innodb_memcached_config.sql
配置脚本创建的。
mysql> USE innodb_memcache;
Database changed
mysql> SHOW TABLES;
+---------------------------+
| Tables_in_innodb_memcache |
+---------------------------+
| cache_policies |
| config_options |
| containers |
+---------------------------+
cache_policies Table
cache_policies
table 定义了InnoDB
memcached
安装的缓存策略。您可以在单个缓存策略中为get
,set
,delete
和flush
操作指定单独的策略。所有操作的默认设置为innodb_only
。
-
innodb_only
:使用InnoDB
作为数据存储。 -
cache_only
:将 memcached 引擎用作数据存储。 -
caching
:同时使用InnoDB
和 memcached 引擎作为数据存储。在这种情况下,如果 memcached 无法在内存中找到键,它将在InnoDB
table 中搜索值。 -
disable
:禁用缓存。
table14.22 cache_policies 列
Column | Description |
---|---|
policy_name | 缓存策略的名称。默认的缓存策略名称为cache_policy 。 |
get_policy | 获取操作的缓存策略。有效值为innodb_only ,cache_only ,caching 或disabled 。默认设置为innodb_only 。 |
set_policy | 设置操作的缓存策略。有效值为innodb_only ,cache_only ,caching 或disabled 。默认设置为innodb_only 。 |
delete_policy | 删除操作的缓存策略。有效值为innodb_only ,cache_only ,caching 或disabled 。默认设置为innodb_only 。 |
flush_policy | 刷新操作的缓存策略。有效值为innodb_only ,cache_only ,caching 或disabled 。默认设置为innodb_only 。 |
config_options Table
config_options
table 存储与 memcached 相关的设置,可以在运行时使用 SQL 进行更改。支持的配置选项是separator
和table_map_delimiter
。
table14.23 config_options 列
Column | Description |
---|---|
Name | 与 memcached 相关的配置选项的名称。 config_options table 支持以下配置选项: |
separator :当定义多个value_columns 时,用于将长字符串的值分隔为单独的值。默认情况下,separator 是| 字符。例如,如果将col1, col2 定义为值列,并将| 定义为分隔符,则可以发出以下 memcached 命令分别将值插入col1 和col2 :设置密钥 x 10 0 19 valuecolx | valuecolyvaluecol1x 存储在col1 中,而valuecoly 存储在col2 中。table_map_delimiter :在键名中使用@@ table 示法访问特定 table 中的键时,将模式名和 table 名分隔的字符。例如,@@t1.some_key 和@@t2.some_key 具有相同的键值,但存储在不同的 table 中。 |
Value | 分配给 memcached 相关配置选项的值。 |
containers Table
containers
table 是三个配置 table 中最重要的。每个用于存储 memcached 值的InnoDB
table 必须在containers
table 中具有一个条目。该条目提供InnoDB
table 列和容器 table 列之间的 Map,memcached
与InnoDB
table 一起使用时需要此 Map。
containers
table 包含test.demo_test
table 的默认条目,该默认条目是由innodb_memcached_config.sql
配置脚本创建的。要将daemon_memcached
插件与您自己的InnoDB
table 一起使用,必须在containers
table 中创建一个条目。
table14.24 容器列
Column | Description | |
---|---|---|
name | 容器的名称。如果未使用@@ 标记按名称请求InnoDB table,则daemon_memcached 插件将使用containers.name 值为default 的InnoDB table。如果没有这样的条目,则containers table 中的第一个条目(按name (升序)按字母 Sequences 排列)将确定默认的InnoDB table。 | |
db_schema | InnoDB table 所在的数据库的名称。这是必需的值。 | |
db_table | 存储 memcached 值的InnoDB table 的名称。这是必需的值。 | |
key_columns | InnoDB table 中的列,其中包含 memcached 操作的查找键值。这是必需的值。 | |
value_columns | 存储memcached 数据的InnoDB table 列(一个或多个)。可以使用innodb_memcached.config_options table 中指定的分隔符指定多列。默认情况下,分隔符是竖线字符(“ | ”)。要指定多列,请使用定义的分隔符将它们分开。例如:col1|col2|col3 。这是必需的值。 |
flags | InnoDB table 列用作 memcached 的标志(用户定义的数值与主值一起存储和检索)。如果将 memcached 值 Map 到多个列,则可以将标志值用作某些操作(例如incr ,prepend )的列说明符,以便对指定的列执行操作。例如,如果您已将value_columns Map 到三个InnoDB table 列,并且只希望对一个列执行增量操作,请使用flags 列来指定该列。如果不使用flags 列,请将0 的值设置为 table 示未使用。 | |
cas_column | 存储比较和交换(cas)值的InnoDB table 列。 cas_column 值与 memcached 将请求散列到不同服务器并在内存中缓存数据的方式有关。由于InnoDB memcached 插件与单个 memcached 守护程序紧密集成,并且内存中缓存机制由 MySQL 和InnoDB 缓冲池处理,因此几乎不需要此列。如果不使用此列,请将0 的值设置为 table 示未使用。 | |
expire_time_column | 存储过期值的InnoDB table 列。 expire_time_column 值与 memcached 将请求散列到不同服务器并在内存中缓存数据的方式有关。由于InnoDB memcached 插件与单个 memcached 守护程序紧密集成,并且内存中缓存机制由 MySQL 和InnoDB 缓冲池处理,因此几乎不需要此列。如果您不使用此列,请将值0 设置为指示该列未使用。最大到期时间定义为INT_MAX32 或 2147483647 秒(大约 68 年)。 | |
unique_idx_name_on_key | 键列上索引的名称。它必须是唯一索引。它可以是primary key或secondary index。最好使用InnoDB table 的主键。使用主键可避免在使用辅助索引时执行的查找。您无法对_memcached **查询进行covering index处理;如果您尝试在键和值列上定义复合二级索引,则InnoDB 返回错误。 |
容器 table 列约束
-
您必须提供
db_schema
,db_name
,key_columns
,value_columns
和unique_idx_name_on_key
的值。如果未使用flags
,cas_column
和expire_time_column
,请指定0
。否则可能会导致安装失败。 -
key_columns
:“ memcached”键的最大限制为 250 个字符,这由 memcached 强制执行。Map 的键必须为非 null CHAR或VARCHAR类型。 -
cas_column
:cas
值为 64 位整数。必须将其 Map 到至少 8 个字节的BIGINT。如果不使用此列,请将值0
设置为指示未使用。 -
expiration_time_column
:必须 Map 到至少 4 个字节的INTEGER。到期时间定义为 Unix 时间的 32 位整数(自 1970 年 1 月 1 日以来的秒数,为 32 位值),或从当前时间开始的秒数。对于后者,秒数不得超过 60 * 60 * 24 * 30(30 天的秒数)。如果 Client 端发送的数字更大,则服务器会将其视为真实的 Unix 时间值,而不是与当前时间的偏移量。如果不使用此列,请将值0
设置为未使用。 -
flags
:必须 Map 到至少 32 位的INTEGER,并且可以为 NULL。如果不使用此列,请将值0
设置为未使用。
在插件加载时执行预检查以强制执行列约束。如果发现不匹配,则不会加载该插件。
多值列 Map
-
在插件初始化期间,当使用
containers
table 中定义的信息配置InnoDB
memcached 时,将对照 Map 的InnoDB
table 验证containers.value_columns
中定义的每个 Map 列。如果 Map 了多个InnoDB
table 列,则将进行检查以确保每个列都存在并且是正确的类型。 -
在运行时,对于
memcached
插入操作,如果定界值比 Map 列数多,则仅获取 Map 值数。例如,如果有六个 Map 列,并且提供了七个定界值,则仅采用前六个定界值。第七个定界值将被忽略。 -
如果分隔值少于 Map 列,则将未填充的列设置为 NULL。如果未填充的列不能设置为 NULL,则插入操作将失败。
-
如果 table 中的列多于 Map 值,则多余的列不会影响结果。
demo_test 示例 table
innodb_memcached_config.sql
配置脚本会在test
数据库中创建一个demo_test
table,该 table 可用于在安装后立即验证InnoDB
memcached 插件的安装。
innodb_memcached_config.sql
配置脚本还会在innodb_memcache.containers
table 中为demo_test
table 创建一个条目。
mysql> SELECT * FROM innodb_memcache.containers\G
*************************** 1. row ***************************
name: aaa
db_schema: test
db_table: demo_test
key_columns: c1
value_columns: c2
flags: c3
cas_column: c4
expire_time_column: c5
unique_idx_name_on_key: PRIMARY
mysql> SELECT * FROM test.demo_test;
+----+------------------+------+------+------+
| c1 | c2 | c3 | c4 | c5 |
+----+------------------+------+------+------+
| AA | HELLO, HELLO | 8 | 0 | 0 |
+----+------------------+------+------+------+