.net Memcache服务关闭-如何处理?
我正在ASP.NET应用程序中使用Memcache。我有3台memcache服务器可供连接。如果所有页面都已关闭,则加载页面时会出现明显延迟。当所有服务器都关闭时,我不想使用memcache 当我逐步浏览代码时,我注意到当服务器关闭时,memcache代码不会抛出异常(我认为我可以在应用程序中“捕获”它并采取必要的步骤).net Memcache服务关闭-如何处理?,.net,memcached,.net,Memcached,我正在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);
}
}