【问题标题】:Is there a way to check if memcached has been restarted?有没有办法检查 memcached 是否已重新启动?
【发布时间】:2023-04-04 09:34:01
【问题描述】:

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

情况:

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

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

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

另一点是:如果这个检查不是一个好主意,我是否应该在每次需要时重新连接,并且那么当memcached 服务器重新启动时,我会避免任何问题。

【问题讨论】:

    标签: c# c++ memcached


    【解决方案1】:

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

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

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

    由于我必须为每个 thread-wake-up 执行一次,因此不会对性能产生任何影响。


    PS:在我的情况下,这并不是那么微不足道,因为有数百个线程,所以我必须向每个 reference 内存缓存键添加一个哈希值,以便每个线程都可以检查情况。

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

    【讨论】:

    • 确实很简单的方法,到头来就这么明显!
    猜你喜欢
    • 2011-06-08
    • 2014-12-22
    • 2022-06-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2016-07-15
    • 1970-01-01
    • 2017-02-07
    相关资源
    最近更新 更多