我最近使用新的 Memcached InnoDB 插件在 AWS 中为 MySQL 5.6 设置了一个 RDS 实例。一切都很好,我的应用程序可以从映射表中存储和检索缓存的项目。当我存储项目时,我提供了超时,并且一旦项目的 TTL 过期,memcached 就不会正确返回项目。到目前为止,一切都很好....
但是,当我查看基础表时,它充满了已经过期的行。
MySQL 文档 ( http://dev.mysql.com/doc/refman/5.6/en/innodb-memcached-intro.html ) 表明使用“ innodb_only ”缓存策略时项目过期无效(尽管它没有t 明确指出它所指的操作)。无论如何,我的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 集成为我做这件事。