• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 控制InnoDB memcached插件的事务行为

    不同于传统的分布式缓存,该daemon_memcached插件可以让你通过调用产生的数据值的控制耐久性addsetincr,等等。默认情况下,通过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开销,则当工作负载减少时,提交可能会变得很少。作为安全措施,后台线程会定期定期提交通过内存缓存 API 进行的更改。间隔由innodb_api_bk_commit_interval配置选项,默认设置为5秒。

    memcached操作在基础InnoDB表中插入或更新数据时,更改的数据将立即对其他memcached请求可见,因为新值保留在内存缓存中,即使尚未在MySQL端提交。

    交易隔离

    当诸如Memcached的操作(例如getincr在基础InnoDB表上引起查询或DML操作)时,您可以控制该操作是否看到写入表的最新数据,仅已提交的数据或事务隔离级别的其他变化。使用innodb_api_trx_level配置选项来控制此功能。为此选项指定的数值对应于隔离级别,例如REPEATABLE READinnodb_api_trx_level有关其他设置的信息,请参见该选项的说明。

    严格的隔离级别可确保您检索的数据不会回滚或突然更改,以免后续查询返回不同的值。但是,严格的隔离级别需要更大的锁定开销,这可能会导致等待。对于不使用长时间运行的事务的NoSQL风格的应用程序,通常可以使用默认隔离级别或切换到不太严格的隔离级别。

    为内存缓存的DML操作禁用行锁

    innodb_api_disable_rowlock当通过插件的内存缓存请求daemon_memcached导致DML操作时,该选项可用于禁用行锁。默认情况下innodb_api_disable_rowlock设置为OFF,这意味着memcached请求行锁定getset操作。当innodb_api_disable_rowlock设置为时ONmemcached请求表锁而不是行锁。

    innodb_api_disable_rowlock选项不是动态的。必须在启动时在mysqld命令行上指定它,或在MySQL配置文件中输入它。

    允许或禁止DDL

    默认情况下,您可以对插件使用的表执行DDL 操作。为避免将这些表用于高吞吐量应用程序时潜在的速度降低,请在启动时启用这些表以禁用DDL操作。通过memcached和SQL 访问同一表时,此选项不太合适,因为它会阻止表上的语句,这对于运行报表查询可能很重要。ALTER TABLEdaemon_memcachedinnodb_api_enable_mdlCREATE INDEX

    将数据存储在磁盘上,内存中或同时存储

    innodb_memcache.cache_policies表指定是否将通过memcached接口写入的数据存储到磁盘(innodb_only默认设置);仅在内存中,与传统的memcachedcache_only)一样;或两者皆有(caching)。

    使用该caching设置,如果memcached在内存中找不到键,它将在InnoDB表中搜索值。如果值在表中的磁盘上已更新但尚未从内存缓存中过期,则get在该caching设置下从调用返回的值可能InnoDB已过期。

    可以为getset(包括incrdecrdelete,和flush操作分别设置缓存策略。

    例如,您可能允许getset以查询操作或更新表和memcached的(使用在同一时间内存缓存caching设置),同时使deleteflush或(使用上都在内存中拷贝只能操作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";