RDS中的Innodb memcached插件不会删除过期的行

时间:2013-08-22 21:40:55

标签: mysql amazon-web-services memcached innodb rds

我最近使用新的Memcached InnoDB插件在AWS for MySQL 5.6中设置了一个RDS实例。一切都很好,我的应用程序可以存储和检索映射表中的缓存项目。当我存储项目时,我提供超时,并且正确的memcached在TTL过期后不会返回该项目。到目前为止一直很好....

然而,当我查看基础表时,它已经满了已经过期的行。

MySQL文档(http://dev.mysql.com/doc/refman/5.6/en/innodb-memcached-intro.html)表示使用“ innodb_only ”缓存策略时项目到期无效(尽管它没有明确指出它所引用的操作) 。在任何情况下,我的cache_policies表都是这样的:

mysql> select * from innodb_memcache.cache_policies;
+--------------+------------+------------+---------------+--------------+
| policy_name  | get_policy | set_policy | delete_policy | flush_policy |
+--------------+------------+------------+---------------+--------------+
| cache_policy | caching    | caching    | innodb_only   | innodb_only  | 
+--------------+------------+------------+---------------+--------------+
1 row in set (0.01 sec)

因此,根据文档,应该尊重到期字段。

作为参考,我的容器表如下所示:

mysql> select * from innodb_memcache.containers;
+---------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+
| name    | db_schema | db_table  | key_columns | value_columns | flags | cas_column | expire_time_column | unique_idx_name_on_key |
+---------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+
| default | sessions  | userData  | sessionID   | data          | c3    | c4         | c5                 | PRIMARY                | 
+---------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+
2 rows in set (0.00 sec)

数据表是:

mysql> desc sessions.userData;
+-----------+---------------------+------+-----+---------+-------+
| Field     | Type                | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------+-------+
| sessionID | varchar(128)        | NO   | PRI | NULL    |       | 
| data      | blob                | YES  |     | NULL    |       | 
| c3        | int(11)             | YES  |     | NULL    |       | 
| c4        | bigint(20) unsigned | YES  |     | NULL    |       | 
| c5        | int(11)             | YES  |     | NULL    |       | 
+-----------+---------------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

还有一个细节,MySQL文档声明在修改缓存策略后需要重新安装Memcached插件,但我没有找到在RDS上执行此操作的方法,因此我删除了Memcached选项组,重新启动,添加再次重新启动memcached选项组...但行为没有明显变化。

因此,总结一下,我在这里错过了一些步骤或配置吗?我不想创建一个单独的进程只是为了从表中删除过期的行,因为我期待Memcached集成为我做这个。

1 个答案:

答案 0 :(得分:0)

我不是专家,因为我刚刚开始玩memcached。但是,这是来自python教程的MySQL文档。

似乎在说如果你使用InnoDB memcached插件,MySQL会处理缓存过期,你输入的缓存过期时间并不重要。

  

And for the flags, expire, and CAS values, we specify corresponding columns based on the settings from the sample table demo.test. These values are typically not significant in applications using the InnoDB memcached plugin, because MySQL keeps the data synchronized and there is no need to worry about data expiring or being stale.