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

Is there a way to check if memcached has been restarted?

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

情况:

  1. 使用上述语言的模块正在通过 memcached 进行通信。他们 运行 - 连同 memcached - 几个月没有任何问题。
  2. memcached 在另一台服务器上 运行。
  3. 出于性能原因,与 memcached 的连接始终保持 open,这意味着一旦每个模块启动,它就会连接到 memcached 并重新使用此连接直到模块停止。

现在,memcached 所在的虚拟机 运行 重新启动的情况非常罕见 - 我无法控制它。 在这种情况下,我看到模块具有未定义的行为。

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

另一点是:如果这不是一个好主意,这个检查是否应该与重新连接花费更多或更少的时间每次需要时我都会重新连接,然后在 memcached 服务器重新启动时避免任何问题。

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

A reference memcached 键 - 例如 HasMemcachedBeenRestarted - 将在模块启动时创建。该值将设置为 NO.

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

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


PS:在我的例子中,这并不是那么微不足道,因为有数百个线程,所以我必须按顺序向每个 reference memcached 键添加一个散列每个线程都可以查看情况。

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