有没有办法检查memcached是否已重新启动?

时间:2018-05-29 08:58:11

标签: c# c++ memcached

我还用C ++和C#标记了这个问题,因为项目中的两种语言都受到了影响。

情况:

  1. 上述语言的模块通过memcached进行通信。它们与memcached一起运行了几个月而没有任何问题。
  2. memcached正在另一台服务器上运行。
  3. 出于性能原因,与memcached的连接始终保持打开,这意味着一次,当每个模块启动时,它连接到memcached并重复使用此连接直到模块停止。
  4. 现在,有一种非常罕见的情况是运行memcached的VM重新启动 - 我无法控制它。 在这种情况下,我看到模块具有未定义的行为。

    我的问题:
    有没有办法可以检测到memcached的实例因重启而变为无效? 在这种情况下,我会再次重新连接。

    另一点是:如果检查或多或少与重新连接同时进行,如果这不是一个好主意我会在每次需要时重新连接然后,当memcached服务器重新启动时,我避免任何问题。

1 个答案:

答案 0 :(得分:1)

我想我找到了一个可能的解决方案 - 它似乎比我想象的要容易:

引用 memcached密钥 - 例如HasMemcachedBeenRestarted - 将在模块启动时创建。该值将设置为NO

模块作为线程运行,并通过外部触发器唤醒。在这种情况下,他们会读取此memcached密钥,当它没有值NO时,很明显memcached已重新启动,然后重新连接。

由于我必须为每个线程唤醒执行一次,因此它不会对性能产生任何影响。

PS:在我的情况下,这并不是那么简单,因为有几百个线程所以我必须在每个引用 memcached键中添加一个哈希,以便每个线程可以检查这种情况。

否则第一个线程会意识到memcached已重新启动并将引用键再次设置为NO,这将导致其他线程认为即使内部连接无效也一切正常。