InnoDB memcached插件内部
用于InnoDB memcached插件的InnoDB API
该InnoDB
memcached的引擎访问InnoDB
过InnoDB
的API,其中大部分是直接从嵌入式采纳InnoDB
。InnoDB
API函数作为回调函数传递给InnoDB
memcached引擎。InnoDB
API函数InnoDB
直接访问表,并且大多数是DML操作(除外)TRUNCATE TABLE
。
memcached命令是通过InnoDB
memcached 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
表定义了InnoDB
memcached
安装的缓存策略。您可以指定单个策略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.name default containers name InnoDB |
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将请求散列到不同服务器并在内存中缓存数据的方式有关。因为InnoDB memcached插件与单个memcached守护程序紧密集成,并且内存中缓存机制由MySQL和 InnoDB缓冲池处理,所以几乎不需要此列。如果不使用此列,则将值设置0 为表示未使用。 |
expire_time_column | InnoDB 存储到期值的表列。该expire_time_column 值与memcached将请求散列到不同服务器并在内存中缓存数据的方式有关。因为InnoDB memcached插件与单个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
为表示未使用。
在插件加载时执行预检查以强制执行列约束。如果发现不匹配,则不会加载该插件。
多值列映射
- 在插件初始化期间,当使用表中定义的信息配置
InnoDB
memcached时,将containers
对照containers.value_columns
映射InnoDB
表验证其中定义的每个映射列。如果InnoDB
映射了多个表列,则进行检查以确保每个列都存在并且是正确的类型。 - 在运行时,对于
memcached
插入操作,如果分隔值比映射列数更多,则仅获取映射值数。例如,如果有六个映射列,并且提供了七个定界值,则仅采用前六个定界值。第七个定界值将被忽略。 - 如果分隔值少于映射列,则将未填充的列设置为NULL。如果未填充的列不能设置为NULL,则插入操作将失败。
- 如果表中的列多于映射值,则多余的列不会影响结果。
demo_test示例表
该innodb_memcached_config.sql
配置脚本创建一个demo_test
表中的test
数据库,它可以用来验证InnoDB
memcached的设置完成后立即安装插件。
该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 | +---- +------------------ +------ +------ +------ +