• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • InnoDB memcached插件内部

    用于InnoDB memcached插件的InnoDB API

    InnoDBmemcached的引擎访问InnoDBInnoDB的API,其中大部分是直接从嵌入式采纳InnoDBInnoDBAPI函数作为回调函数传递给InnoDBmemcached引擎。InnoDBAPI函数InnoDB直接访问表,并且大多数是DML操作(除外)TRUNCATE TABLE

    memcached命令是通过InnoDBmemcached API实现的。下表概述了如何将 memcached命令映射到DML或DDL操作。

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

    memcached命令DML或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插件配置表

    本节描述了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安装的缓存策略。您可以指定单个策略getsetdelete,和flush单一高速缓存策略中的操作。所有操作的默认设置为innodb_only

    • innodb_onlyInnoDB用作数据存储。
    • cache_only:使用memcached引擎作为数据存储。
    • caching:同时使用InnoDBmemcached引擎作为数据存储。在这种情况下,如果memcached在内存中找不到键,则会在InnoDB表中搜索值。
    • disable:禁用缓存。

    cache_policies列

    描述
    policy_name缓存策略的名称。默认的缓存策略名称是cache_policy
    get_policy获取操作的缓存策略。有效值是innodb_onlycache_onlycaching,或disabled。默认设置为innodb_only
    set_policy设置操作的缓存策略。有效值是innodb_onlycache_onlycaching,或disabled。默认设置为innodb_only
    delete_policy删除操作的缓存策略。有效值是innodb_onlycache_onlycaching,或disabled。默认设置为innodb_only
    flush_policy刷新操作的缓存策略。有效值是innodb_onlycache_onlycaching,或disabled。默认设置为innodb_only

    config_options表

    config_options表存储了与内存缓存相关的设置,可以在运行时使用SQL对其进行更改。支持的配置选项是separatortable_map_delimiter

    config_options列

    描述
    Namememcached相关的配置选项的名称。该config_options表支持以下配置选项:
    • separator:用于在value_columns定义多个字符串时将长字符串的值分离为单独的值。默认情况下,separator|字符。例如,如果您定义col1, col2为值列,并且定义|为分隔符,则可以发出以下memcached命令将值分别插入col1和中col2

      set keyx 10 0 19
      valuecolx|valuecoly
      

      valuecol1x存储在中col1valuecoly并存储在中col2

    • table_map_delimiter@@在键名中使用符号访问特定表中的键时,将模式名和表名分隔的字符。例如,@@t1.some_key@@t2.some_key具有相同的键值,但存储在不同的表中。
    Value分配给与memcached相关的配置选项的值。

    容器表

    containers表是三个配置表中最重要的。InnoDB用于存储内存缓存值的每个表必须在containers表中具有一个条目。该条目提供了InnoDB表列和容器表列之间的映射,这是memcached使用InnoDB表所必需的。

    containers表包含该表的默认条目,该条目test.demo_testinnodb_memcached_config.sql配置脚本创建。要将daemon_memcached插件与您自己的InnoDB表一起使用,必须在containers表中创建一个条目。

    容器列

    描述
    name容器的名称。如果InnoDB未使用@@符号通过名称来请求表,则daemon_memcached插件将使用值为的InnoDB表。如果没有这样的条目,则表中的第一个条目(按升序按字母顺序排列)将确定默认表。containers.namedefaultcontainersnameInnoDB
    db_schemaInnoDB表所在的数据库的名称。这是必需的值。
    db_tableInnoDB存储memcached值的表的名称。这是必需的值。
    key_columnsInnoDB表中的列包含用于memcached操作的查找键值。这是必需的值。
    value_columnsInnoDB存储memcached数据的表列(一个或多个)。可以使用表中指定的分隔符指定多列innodb_memcached.config_options。默认情况下,分隔符是竖线字符(“| ”)。要指定多列,请使用定义的分隔符将它们分开。例如:col1|col2|col3。这是必需的值。
    flagsInnoDB用作memcached的标志(与主值一起存储和检索的用户定义的数值)的表列。一个标志值可被用作一列说明对于一些操作(如incrprepend)如果一个分布式缓存值被映射到多列,使得操作上的指定列执行。例如,如果您已将a映射value_columns到三个InnoDB表列,并且只希望对一个列执行增量操作,请使用该flags列指定该列。如果您不使用flags列,将值设置0为表示未使用。
    cas_columnInnoDB存储比较和交换(cas)值的表列。该cas_column值与memcached将请求散列到不同服务器并在内存中缓存数据的方式有关。因为InnoDBmemcached插件与单个memcached守护程序紧密集成,并且内存中缓存机制由MySQL和 InnoDB缓冲池处理,所以几乎不需要此列。如果不使用此列,则将值设置0为表示未使用。
    expire_time_columnInnoDB存储到期值的表列。该expire_time_column值与memcached将请求散列到不同服务器并在内存中缓存数据的方式有关。因为InnoDBmemcached插件与单个memcached守护程序紧密集成,并且内存中缓存机制由MySQL和 InnoDB缓冲池处理,所以几乎不需要此列。如果不使用此列,则将值设置0为表示该列未使用。最大到期时间定义为INT_MAX32或2147483647秒(大约68年)。
    unique_idx_name_on_key键列上索引的名称。它必须是唯一索引。它可以是主键或辅助索引。最好使用InnoDB表的主键。使用主键可避免在使用辅助索引时执行的查找。您无法为memcached查找建立覆盖索引;如果您尝试在键和值列上定义一个复合二级索引,则返回错误。InnoDB

    容器表列约束

    • 你必须提供一个值db_schemadb_namekey_columnsvalue_columnsunique_idx_name_on_key。指定0flagscas_column以及expire_time_column如果它们是未使用。否则可能会导致安装失败。
    • key_columnsmemcached键的最大限制为 250个字符,由memcached强制执行。映射的键必须是非null CHARVARCHAR类型。
    • value_columns:必须被映射到CHARVARCHAR或者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 	|
    +----	+------------------	+------	+------	+------	+