14.21.7 InnoDB memcached 插件内部

InnoDB Memcached 插件的 InnoDB API

InnoDB memcached 引擎通过InnoDB API 访问InnoDB,其中大多数直接从嵌入式InnoDB中采用。 InnoDB API 函数作为回调函数传递到InnoDB memcached 引擎。 InnoDB API 函数直接访问InnoDBtable,并且大多数都是 DML 操作,但TRUNCATE TABLE除外。

memcached 命令是通过InnoDB memcached API 实现的。下 table 概述了如何将“ memcached”命令 Map 到 DML 或 DDL 操作。

table14.21 memcached 命令和相关的 DML 或 DDL 操作

memcached CommandDML 或 DDL 操作
get读/取命令
set搜索后跟一个INSERTUPDATE(取决于密钥是否存在)
add搜索后跟着INSERTUPDATE
replace搜索后跟着UPDATE
append搜索后跟UPDATE(将数据附加到UPDATE之前的结果中)
prepend搜索后跟UPDATE(将数据添加到UPDATE之前的结果中)
incr搜索后跟着UPDATE
decr搜索后跟着UPDATE
delete搜索后跟着DELETE
flush_allTRUNCATE TABLE(DDL)

InnoDB memcached 插件配置 table

本节介绍daemon_memcached插件使用的配置 table。 cache_policiestable,config_optionstable 和containerstable 是由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_policiestable 定义了InnoDB memcached安装的缓存策略。您可以在单个缓存策略中为getsetdeleteflush操作指定单独的策略。所有操作的默认设置为innodb_only

  • innodb_only:使用InnoDB作为数据存储。

  • cache_only:将 memcached 引擎用作数据存储。

  • caching:同时使用InnoDBmemcached 引擎作为数据存储。在这种情况下,如果 memcached 无法在内存中找到键,它将在InnoDBtable 中搜索值。

  • disable:禁用缓存。

table14.22 cache_policies 列

ColumnDescription
policy_name缓存策略的名称。默认的缓存策略名称为cache_policy
get_policy获取操作的缓存策略。有效值为innodb_onlycache_onlycachingdisabled。默认设置为innodb_only
set_policy设置操作的缓存策略。有效值为innodb_onlycache_onlycachingdisabled。默认设置为innodb_only
delete_policy删除操作的缓存策略。有效值为innodb_onlycache_onlycachingdisabled。默认设置为innodb_only
flush_policy刷新操作的缓存策略。有效值为innodb_onlycache_onlycachingdisabled。默认设置为innodb_only

config_options Table

config_optionstable 存储与 memcached 相关的设置,可以在运行时使用 SQL 进行更改。支持的配置选项是separatortable_map_delimiter

table14.23 config_options 列

ColumnDescription
Name与 memcached 相关的配置选项的名称。 config_optionstable 支持以下配置选项:

separator:当定义多个value_columns时,用于将长字符串的值分隔为单独的值。默认情况下,separator|字符。例如,如果将col1, col2定义为值列,并将|定义为分隔符,则可以发出以下 memcached 命令分别将值插入col1col2
设置密钥 x 10 0 19
valuecolx
valuecoly
valuecol1x存储在col1中,而valuecoly存储在col2中。
table_map_delimiter:在键名中使用@@table 示法访问特定 table 中的键时,将模式名和 table 名分隔的字符。例如,@@t1.some_key@@t2.some_key具有相同的键值,但存储在不同的 table 中。
Value分配给 memcached 相关配置选项的值。

containers Table

containerstable 是三个配置 table 中最重要的。每个用于存储 memcached 值的InnoDBtable 必须在containerstable 中具有一个条目。该条目提供InnoDBtable 列和容器 table 列之间的 Map,memcachedInnoDBtable 一起使用时需要此 Map。

containerstable 包含test.demo_testtable 的默认条目,该默认条目是由innodb_memcached_config.sql配置脚本创建的。要将daemon_memcached插件与您自己的InnoDBtable 一起使用,必须在containerstable 中创建一个条目。

table14.24 容器列

ColumnDescription
name容器的名称。如果未使用@@标记按名称请求InnoDBtable,则daemon_memcached插件将使用containers.name值为defaultInnoDBtable。如果没有这样的条目,则containerstable 中的第一个条目(按name(升序)按字母 Sequences 排列)将确定默认的InnoDBtable。
db_schemaInnoDBtable 所在的数据库的名称。这是必需的值。
db_table存储 memcached 值的InnoDBtable 的名称。这是必需的值。
key_columnsInnoDBtable 中的列,其中包含 memcached 操作的查找键值。这是必需的值。
value_columns存储memcached数据的InnoDBtable 列(一个或多个)。可以使用innodb_memcached.config_optionstable 中指定的分隔符指定多列。默认情况下,分隔符是竖线字符(“”)。要指定多列,请使用定义的分隔符将它们分开。例如:col1|col2|col3。这是必需的值。
flagsInnoDBtable 列用作 memcached 的标志(用户定义的数值与主值一起存储和检索)。如果将 memcached 值 Map 到多个列,则可以将标志值用作某些操作(例如incrprepend)的列说明符,以便对指定的列执行操作。例如,如果您已将value_columnsMap 到三个InnoDBtable 列,并且只希望对一个列执行增量操作,请使用flags列来指定该列。如果不使用flags列,请将0的值设置为 table 示未使用。
cas_column存储比较和交换(cas)值的InnoDBtable 列。 cas_column值与 memcached 将请求散列到不同服务器并在内存中缓存数据的方式有关。由于InnoDB memcached 插件与单个 memcached 守护程序紧密集成,并且内存中缓存机制由 MySQL 和InnoDB 缓冲池处理,因此几乎不需要此列。如果不使用此列,请将0的值设置为 table 示未使用。
expire_time_column存储过期值的InnoDBtable 列。 expire_time_column值与 memcached 将请求散列到不同服务器并在内存中缓存数据的方式有关。由于InnoDB memcached 插件与单个 memcached 守护程序紧密集成,并且内存中缓存机制由 MySQL 和InnoDB 缓冲池处理,因此几乎不需要此列。如果您不使用此列,请将值0设置为指示该列未使用。最大到期时间定义为INT_MAX32或 2147483647 秒(大约 68 年)。
unique_idx_name_on_key键列上索引的名称。它必须是唯一索引。它可以是primary keysecondary index。最好使用InnoDBtable 的主键。使用主键可避免在使用辅助索引时执行的查找。您无法对_memcached **查询进行covering index处理;如果您尝试在键和值列上定义复合二级索引,则InnoDB返回错误。
容器 table 列约束
  • 您必须提供db_schemadb_namekey_columnsvalue_columnsunique_idx_name_on_key的值。如果未使用flagscas_columnexpire_time_column,请指定0。否则可能会导致安装失败。

  • key_columns:“ memcached”键的最大限制为 250 个字符,这由 memcached 强制执行。Map 的键必须为非 null CHARVARCHAR类型。

  • value_columns:必须 Map 到CHARVARCHARBLOB列。没有长度限制,值可以为 NULL。

  • cas_columncas值为 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
  • 在插件初始化期间,当使用containerstable 中定义的信息配置InnoDB memcached 时,将对照 Map 的InnoDBtable 验证containers.value_columns中定义的每个 Map 列。如果 Map 了多个InnoDBtable 列,则将进行检查以确保每个列都存在并且是正确的类型。

  • 在运行时,对于memcached插入操作,如果定界值比 Map 列数多,则仅获取 Map 值数。例如,如果有六个 Map 列,并且提供了七个定界值,则仅采用前六个定界值。第七个定界值将被忽略。

  • 如果分隔值少于 Map 列,则将未填充的列设置为 NULL。如果未填充的列不能设置为 NULL,则插入操作将失败。

  • 如果 table 中的列多于 Map 值,则多余的列不会影响结果。

demo_test 示例 table

innodb_memcached_config.sql配置脚本会在test数据库中创建一个demo_testtable,该 table 可用于在安装后立即验证InnoDB memcached 插件的安装。

innodb_memcached_config.sql配置脚本还会在innodb_memcache.containerstable 中为demo_testtable 创建一个条目。

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 |
+----+------------------+------+------+------+