.net Memcache服务关闭-如何处理?

.net Memcache服务关闭-如何处理?,.net,memcached,.net,Memcached,我正在ASP.NET应用程序中使用Memcache。我有3台memcache服务器可供连接。如果所有页面都已关闭,则加载页面时会出现明显延迟。当所有服务器都关闭时,我不想使用memcache 当我逐步浏览代码时,我注意到当服务器关闭时,memcache代码不会抛出异常(我认为我可以在应用程序中“捕获”它并采取必要的步骤) 我将如何处理这种情况?如何检查服务是否关闭?有几种方法: 检查进程是否正在运行(如果您正在检查同一台机器)。我怀疑它是否快 尝试连接到套接字,查看连接是否失败。我也怀疑它是否

我正在ASP.NET应用程序中使用Memcache。我有3台memcache服务器可供连接。如果所有页面都已关闭,则加载页面时会出现明显延迟。当所有服务器都关闭时,我不想使用memcache

当我逐步浏览代码时,我注意到当服务器关闭时,memcache代码不会抛出异常(我认为我可以在应用程序中“捕获”它并采取必要的步骤)


我将如何处理这种情况?

如何检查服务是否关闭?有几种方法:

  • 检查进程是否正在运行(如果您正在检查同一台机器)。我怀疑它是否快
  • 尝试连接到套接字,查看连接是否失败。我也怀疑它是否快

所以,只要采取一些措施,不要让所有的内存缓存都崩溃。例如,使用monit观看它们。

因为Enyim是开源的,所以您可以编辑,如下所示:

    /// <summary>
    /// Marks a node as dead (unusable)
    ///  - moves hte node to the  "dead list"
    ///  - recreates the locator based on the new list of still functioning servers
    /// </summary>
    /// <param name="node"></param>
    private void MarkAsDead(MemcachedNode node)
    {
        this.serverAccessLock.UpgradeToWriterLock(Timeout.Infinite);

        try
        {
            // server gained AoeREZ while AFK?
            if (!node.IsAlive)
            {
                this.workingServers.Remove(node);
                this.deadServers.Add(node);

                // check if all servers are dead
                if (this.workingServers.Count == 0)
                    throw new NoMoreServersException();

                this.RebuildIndexes();
            }
        }
        finally
        {
            this.serverAccessLock.ReleaseLock();
        }
    }

您还应该创建
nomoreserversceception
(或者使用一般异常(但不建议这样做))

您在这里尝试的并不是应用程序的工作

假设您的缓存接口是这样的

public class CacheManager
{
    protected ICacheProvider _repository;
    public CacheManager(ICacheProvider repository)
    {
        _repository = repository;
    }

    public void Store(string key, object data)
    {
        _repository.Store(key, data);
    }

    public void Destroy(string key)
    {
        _repository.Destroy(key);
    }

    public T Get<T>(string key)
    {
        return _repository.Get<T>(key);
    }
}
公共类缓存管理器
{
受保护的ICacheProvider\u存储库;
公共CacheManager(ICacheProvider存储库)
{
_存储库=存储库;
}
公共无效存储(字符串键、对象数据)
{
_存储库(密钥、数据);
}
公共无效销毁(字符串键)
{
_销毁(密钥);
}
公共T获取(字符串键)
{
return _repository.Get(key);
}
}
如果是这种情况,那么如果所有memcache服务器都关闭,您的选择是什么?您只能通过访问db/filesystem/等来继续正常生活。毕竟,按定义缓存是不可靠的


假设您的memcached运行在*nix服务器上,您应该寻找从网络或操作系统级别监视它的方法。Memcached有一个。编写规则/脚本来解析并通知管理员并将其打开。最简单的选择是使用IMHO

您使用的是哪个.NET客户端?恩伊姆?Memcachedotnet?我正在使用Enyim。我正在试图找出如何检查所有服务器是否都已关闭。我什么时候在哪里做这个?谢谢。从代码中可以看出,一旦创建了Memcacheclient实例,就会有一个计时器在每次deadTimeOut时都会关闭,以检查死机服务器是否启动。我想做的就是一旦服务器宕机,向管理员发送警报并停止使用memcache。我的应用程序中有一个布尔标志,可以用来检查是否要使用memcache。但是,我如何得到这个值呢?
public class CacheManager
{
    protected ICacheProvider _repository;
    public CacheManager(ICacheProvider repository)
    {
        _repository = repository;
    }

    public void Store(string key, object data)
    {
        _repository.Store(key, data);
    }

    public void Destroy(string key)
    {
        _repository.Destroy(key);
    }

    public T Get<T>(string key)
    {
        return _repository.Get<T>(key);
    }
}