需要暂停和刷新 memcached 服务器(或服务器池)以保持数据完整性

Need to suspend and flush memcached server (or server pool) to maintain data integrity

我有这个与维护相关的问题,我在几个地方寻找答案,但没有找到具体答案。

情况是这样的:

我们有几个 mysql 查询为我们的网络应用程序生成菜单。大约每天一次,我们需要更新表格,这些更新会影响菜单的生成。自然地,我们将这些更新包含在一个事务中。

到目前为止一切顺利。但是为了提高速度和响应能力以及减少数据库负载,我们希望使用 memcached。在所有方面,memcached 都非常适合这个角色,因为每天只更新一次。

但是我们想做的是:

  1. 我们的更新脚本启动,它的第一个操作是 "suspend" 内存缓存池。完成后,memcached 不再回答查询,所有查询都传递给 mysql。重要的是,memcached 服务器仍会快速响应未命中,以便 mysql 迅速采取行动。还有一个很重要的是,在此期间,memcached会拒绝设置任何数据。

  2. 刷新内存缓存池中的所有数据。

  3. 更新脚本运行s.

  4. 恢复memcached正常运行。

所以,1. 和 4. 是我卡住的地方。

我们的技术基于 mysql 和 PHP。我正在使用 nginx memcached 模块直接从 memcached 检索数据。但是设置缓存的 PHP 可以 运行 在许多不同的地方。

话虽如此,我对使用任何语言或技术持开放态度。这是一个足够普遍的问题,我们可以讨论任何最有效的方法。

提前感谢您的回复。

从缓存中的一组数据(原子地)交换的常用方法是使用 Namespace。存储在自己的键中并在继续获取主要缓存数据之前首先查询的前缀。

它是这样工作的:

  • 您在一个键下有一个 'namespace' - 例如它可以是 date/time - menuNamespace = 'menu:15050414:'(2015-05-04,下午 2 点菜单构建)。
  • 该键是菜单的所有实际数据或其他数据的前缀,例如:menu:15050414:top-menumenu:15050414:l2-menu、等等
  • 后端系统使用新键构建一组新的缓存数据:menu:15050510:top-menumenu:15050510:l2-menu
  • 只有当数据到位后,才将命名空间键缓存条目从'menu:15050414:'更改为'menu:15050510:'
  • 下次提取命名空间时,它用作前缀以提取新数据。

MemcacheD FAQ/tricks page 关于命名空间还有更多内容。

根据@alister_b的初步回答,有一种更简单的方法可以解决我最初的问题。

关键是向 PHP 代码发出信号以停止设置缓存值。这可以通过 setCache:false 之类的 memcached 条目或通过 MySQL 列来完成。

然后,刷新命令将保证 nginx 缓存未命中。

表更新后,setCache 设置为 true 并恢复 php 的正常设置。

这将与我的 Ajax 通话一起正常工作。

它与命名空间不互斥。