有没有办法检查内存缓存是否已重新启动?

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

本文关键字:是否 重新启动 缓存 内存 检查 有没有      更新时间:2023-10-16

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

情况:

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

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

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

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

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

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

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

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


PS:就我而言,这不是那么微不足道,因为有数百个线程,所以我必须向每个引用memcached键添加一个哈希值,以便每个线程可以检查情况。

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