我最近使用新的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集成为我做这个。
答案 0 :(得分:0)
我不是专家,因为我刚刚开始玩memcached。但是,这是来自python教程的MySQL文档。
似乎在说如果你使用InnoDB memcached插件,MySQL会处理缓存过期,你输入的缓存过期时间并不重要。