InnoDB memcached插件内部
用于InnoDB memcached插件的InnoDB API
该InnoDBmemcached的引擎访问InnoDB过InnoDB的API,其中大部分是直接从嵌入式采纳InnoDB。InnoDBAPI函数作为回调函数传递给InnoDBmemcached引擎。InnoDBAPI函数InnoDB直接访问表,并且大多数是DML操作(除外)TRUNCATE TABLE。
memcached命令是通过InnoDBmemcached API实现的。下表概述了如何将 memcached命令映射到DML或DDL操作。
memcached命令和相关的DML或DDL操作
| memcached命令 | 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插件配置表
本节描述了daemon_memcached插件使用的配置表。该cache_policies表,config_options表和containers表是由数据库中的innodb_memcached_config.sql配置脚本创建的innodb_memcache。
mysql>USE innodb_memcache;Database changed mysql>SHOW TABLES ; +--------------------------- + | Tables_in_innodb_memcache | +--------------------------- + | cache_policies | | config_options | | containers | +--------------------------- +
cache_policies表
该cache_policies表定义了InnoDBmemcached安装的缓存策略。您可以指定单个策略get,set,delete,和flush单一高速缓存策略中的操作。所有操作的默认设置为innodb_only。
innodb_only:InnoDB用作数据存储。cache_only:使用memcached引擎作为数据存储。caching:同时使用InnoDB和memcached引擎作为数据存储。在这种情况下,如果memcached在内存中找不到键,则会在InnoDB表中搜索值。disable:禁用缓存。
cache_policies列
| 柱 | 描述 |
|---|---|
| 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表
该config_options表存储了与内存缓存相关的设置,可以在运行时使用SQL对其进行更改。支持的配置选项是separator和table_map_delimiter。
config_options列
| 柱 | 描述 |
|---|---|
| Name | 与memcached相关的配置选项的名称。该config_options表支持以下配置选项:
|
| Value | 分配给与memcached相关的配置选项的值。 |
容器表
该containers表是三个配置表中最重要的。InnoDB用于存储内存缓存值的每个表必须在containers表中具有一个条目。该条目提供了InnoDB表列和容器表列之间的映射,这是memcached使用InnoDB表所必需的。
该containers表包含该表的默认条目,该条目test.demo_test由innodb_memcached_config.sql配置脚本创建。要将daemon_memcached插件与您自己的InnoDB表一起使用,必须在containers表中创建一个条目。
容器列
| 柱 | 描述 |
|---|---|
| name | 容器的名称。如果InnoDB未使用@@符号通过名称来请求表,则daemon_memcached插件将使用值为的InnoDB表。如果没有这样的条目,则表中的第一个条目(按升序按字母顺序排列)将确定默认表。containers.namedefaultcontainersnameInnoDB |
| db_schema | 该InnoDB表所在的数据库的名称。这是必需的值。 |
| db_table | InnoDB存储memcached值的表的名称。这是必需的值。 |
| key_columns | 该InnoDB表中的列包含用于memcached操作的查找键值。这是必需的值。 |
| value_columns | InnoDB存储memcached数据的表列(一个或多个)。可以使用表中指定的分隔符指定多列innodb_memcached.config_options。默认情况下,分隔符是竖线字符(“| ”)。要指定多列,请使用定义的分隔符将它们分开。例如:col1|col2|col3。这是必需的值。 |
| flags | InnoDB用作memcached的标志(与主值一起存储和检索的用户定义的数值)的表列。一个标志值可被用作一列说明对于一些操作(如incr,prepend)如果一个分布式缓存值被映射到多列,使得操作上的指定列执行。例如,如果您已将a映射value_columns到三个InnoDB表列,并且只希望对一个列执行增量操作,请使用该flags列指定该列。如果您不使用flags列,将值设置0为表示未使用。 |
| cas_column | InnoDB存储比较和交换(cas)值的表列。该cas_column值与memcached将请求散列到不同服务器并在内存中缓存数据的方式有关。因为InnoDBmemcached插件与单个memcached守护程序紧密集成,并且内存中缓存机制由MySQL和 InnoDB缓冲池处理,所以几乎不需要此列。如果不使用此列,则将值设置0为表示未使用。 |
| expire_time_column | InnoDB存储到期值的表列。该expire_time_column值与memcached将请求散列到不同服务器并在内存中缓存数据的方式有关。因为InnoDBmemcached插件与单个memcached守护程序紧密集成,并且内存中缓存机制由MySQL和 InnoDB缓冲池处理,所以几乎不需要此列。如果不使用此列,则将值设置0为表示该列未使用。最大到期时间定义为INT_MAX32或2147483647秒(大约68年)。 |
| unique_idx_name_on_key | 键列上索引的名称。它必须是唯一索引。它可以是主键或辅助索引。最好使用InnoDB表的主键。使用主键可避免在使用辅助索引时执行的查找。您无法为memcached查找建立覆盖索引;如果您尝试在键和值列上定义一个复合二级索引,则返回错误。InnoDB |
容器表列约束
- 你必须提供一个值
db_schema,db_name,key_columns,value_columns和unique_idx_name_on_key。指定0的flags,cas_column以及expire_time_column如果它们是未使用。否则可能会导致安装失败。 key_columns:memcached键的最大限制为 250个字符,由memcached强制执行。映射的键必须是非nullCHAR或VARCHAR类型。value_columns:必须被映射到CHAR,VARCHAR或者BLOB柱。没有长度限制,值可以为NULL。cas_column:该cas值为64位整数。必须将其映射到BIGINT至少8个字节的。如果不使用此列,则将值设置0为表示未使用。expiration_time_column:必须映射到INTEGER至少4个字节的。到期时间被定义为Unix时间的32位整数(自1970年1月1日以来的秒数,为32位值),或从当前时间开始的秒数。对于后者,秒数不得超过60 * 60 * 24 * 30(30天的秒数)。如果客户端发送的数字更大,则服务器将其视为真实的Unix时间值,而不是与当前时间的偏移量。如果不使用此列,则将值设置0为表示未使用。flags:必须映射到INTEGER至少32位的,并且可以为NULL。如果不使用此列,则将值设置0为表示未使用。
在插件加载时执行预检查以强制执行列约束。如果发现不匹配,则不会加载该插件。
多值列映射
- 在插件初始化期间,当使用表中定义的信息配置
InnoDBmemcached时,将containers对照containers.value_columns映射InnoDB表验证其中定义的每个映射列。如果InnoDB映射了多个表列,则进行检查以确保每个列都存在并且是正确的类型。 - 在运行时,对于
memcached插入操作,如果分隔值比映射列数更多,则仅获取映射值数。例如,如果有六个映射列,并且提供了七个定界值,则仅采用前六个定界值。第七个定界值将被忽略。 - 如果分隔值少于映射列,则将未填充的列设置为NULL。如果未填充的列不能设置为NULL,则插入操作将失败。
- 如果表中的列多于映射值,则多余的列不会影响结果。
demo_test示例表
该innodb_memcached_config.sql配置脚本创建一个demo_test表中的test数据库,它可以用来验证InnoDBmemcached的设置完成后立即安装插件。
该innodb_memcached_config.sql配置脚本还创建了一个条目demo_test表中的innodb_memcache.containers表。
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 | +---- +------------------ +------ +------ +------ +
