与传统的memcached不同,该
        daemon_memcached插件允许您控制通过调用
        add、set、
        incr等生成的数据值的持久性。默认情况下,通过memcached接口写入的数据存储到磁盘,并调用get从磁盘返回最近的值。虽然默认行为不提供最佳的原始性能,但与InnoDB表的 SQL 接口相比仍然很快。
      
        当您获得使用该
        daemon_memcached插件的经验时,您可以考虑放宽对非关键数据类的持久性设置,以防在发生中断时丢失一些更新的值,或返回稍微过时的数据。
提交频率
持久性和原始性能之间的一种权衡是 提交新数据和更改数据的频率。如果数据很重要,则应立即提交,以便在意外退出或中断的情况下是安全的。如果数据不那么重要,例如在意外退出后重置的计数器或您可以承受丢失的日志数据,您可能更喜欢更高的原始吞吐量,而这些吞吐量在提交频率较低的情况下可用。
        当memcached操作在基础表中插入、更新或删除数据时InnoDB
        ,更改可能会
        InnoDB立即(如果
        daemon_memcached_w_batch_size=1)或稍后(如果
        daemon_memcached_w_batch_size
        值大于 1)提交到表。在任何一种情况下,更改都无法回滚。如果您增加 的值
        daemon_memcached_w_batch_size
        以避免在繁忙时间出现高 I/O 开销,那么当工作负载减少时,提交可能会变得不频繁。作为一项安全措施,后台线程会定期自动提交通过memcached API 所做的更改。间隔由控制
        innodb_api_bk_commit_interval
        配置选项,默认设置为
        5秒。
      
        当memcached操作在基础表中插入或更新数据时InnoDB,更改的数据立即对其他
        memcached请求可见,因为新值保留在内存缓存中,即使它尚未在 MySQL 端提交也是如此。
事务隔离
        当诸如
        or之类的memcached操作导致对基础
        表进行查询或 DML 操作时,您可以控制该操作是看到写入表的最新数据,还是只看到已提交的数据,或者事务
        隔离级别的其他变体。使用
        配置选项来控制此功能。为此选项指定的数值对应于隔离级别,例如
        . 有关其他设置的信息,
      请参阅该选项的说明
        。getincrInnoDBinnodb_api_trx_levelREPEATABLE READinnodb_api_trx_level
严格的隔离级别可确保您检索的数据不会回滚或突然更改,从而导致后续查询返回不同的值。但是,严格的隔离级别需要更大的锁定 开销,这会导致等待。对于不使用长时间运行事务的 NoSQL 样式应用程序,您通常可以使用默认隔离级别或切换到不太严格的隔离级别。
为 memcached DML 操作禁用行锁
当memcached通过
        插件请求导致 DML 操作时,
        该innodb_api_disable_rowlock
        选项可用于禁用行锁
        。默认情况下,设置为这意味着
        memcached请求行锁
        和操作。当设置为 时
        ,memcached请求表锁而不是行锁。
      daemon_memcachedinnodb_api_disable_rowlockOFFgetsetinnodb_api_disable_rowlockON
        该innodb_api_disable_rowlock选项不是动态的。它必须在启动时在
        mysqld命令行上指定或输入到 MySQL 配置文件中。
允许或禁止 DDL
        默认情况下,您可以执行DDL
        操作,例如在插件ALTER TABLE使用的表上。daemon_memcached为避免在将这些表用于高吞吐量应用程序时可能出现的减速,请通过
        innodb_api_enable_mdl在启动时启用来禁用对这些表的 DDL 操作。当通过memcached和 SQL访问相同的表时,此选项不太合适,因为它会阻止CREATE INDEX
        表上的语句,这对于运行报告查询可能很重要。
将数据存储在磁盘、内存或两者中
        该innodb_memcache.cache_policies表指定是否将通过
        memcached接口写入的数据存储到磁盘(innodb_only,默认值);仅在内存中,与传统的memcached 
        ( cache_only) 一样;或两者 ( caching)。
      
        通过caching设置,如果
        memcached在内存中找不到键,它会在InnoDB表中搜索值。如果值已在表中的磁盘上更新
        但尚未从内存缓存中过期,则从
      设置get下的调用
        返回的值可能已过期。cachingInnoDB
        可以为
        get、set(包括
        incr和decr)、
         delete、 和flush
        操作独立设置缓存策略。
      
        例如,您可能允许get和
        set操作同时查询或更新表和memcached内存缓存(使用caching设置),同时使
        delete、flush或两者仅对内存中的副本进行操作(使用
        cache_only设置)。这样,删除或刷新项目只会使缓存中的项目过期,并在InnoDB
        下次请求该项目时从表中返回最新值。
      
mysql> SELECT * FROM innodb_memcache.cache_policies;
+--------------+-------------+-------------+---------------+--------------+
| policy_name  | get_policy  | set_policy  | delete_policy | flush_policy |
+--------------+-------------+-------------+---------------+--------------+
| cache_policy | innodb_only | innodb_only | innodb_only   | innodb_only  |
+--------------+-------------+-------------+---------------+--------------+
mysql> UPDATE innodb_memcache.cache_policies SET set_policy = 'caching'
       WHERE policy_name = 'cache_policy';
        innodb_memcache.cache_policies值仅在启动时读取。更改此表中的值后,卸载并重新安装daemon_memcached
        插件以确保更改生效。
      
mysql> UNINSTALL PLUGIN daemon_memcached;
mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";