2

我最近使用新的 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 集成为我做这件事。

4

1 回答 1

0

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

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

对于 flags、expire 和 CAS 值,我们根据示例表 demo.test 中的设置指定相应的列。这些值在使用 InnoDB memcached 插件的应用程序中通常并不重要,因为 MySQL 保持数据同步,无需担心数据过期或过时。

于 2013-10-17T05:17:53.367 回答