我在我们的生产环境中有以下问题(Web-Found-4节点,最上面的负载均衡器):
1) Timeout performing HGET key, inst: 3, queue: 29, qu=0, qs=29, qc=0, wr=0/0 at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor``1 processor, ServerEndPoint server) in ConnectionMultiplexer.cs:line 1699这种情况立即发生3-10次。
2) No connection is available to service this operation: HGET key at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor``1 processor, ServerEndPoint server) in ConnectionMultiplexer.cs:line 1666
我试着按照Marc的建议来实现(也许我对它的解释不正确)--与Redis的连接比多个更好。我做了以下的实现:
public class SeRedisConnection
{
private static ConnectionMultiplexer _redis;
private static readonly object SyncLock = new object();
public static IDatabase GetDatabase()
{
if (_redis == null || !_redis.IsConnected || !_redis.GetDatabase().IsConnected(default(RedisKey)))
{
lock (SyncLock)
{
try
{
var configurationOptions = new ConfigurationOptions
{
AbortOnConnectFail = false
};
configurationOptions.EndPoints.Add(new DnsEndPoint(ConfigurationHelper.CacheServerHost,
ConfigurationHelper.CacheServerHostPort));
_redis = ConnectionMultiplexer.Connect(configurationOptions);
}
catch (Exception ex)
{
IoC.Container.Resolve<IErrorLog>().Error(ex);
return null;
}
}
}
return _redis.GetDatabase();
}
public static void Dispose()
{
_redis.Dispose();
}
}实际上现在还没有使用过。此外,我还有一些具体的实现,这些实现可能导致这样的行为(我只使用散列):1.添加、删除散列-异步2.获取-sync
有人能帮我避免这种行为吗?
提前谢谢!
解决了-在评估网络能力之后增加了客户端连接超时。
更新2:实际上它并没有解决问题。当缓存容量开始增加时,例如从2GB开始。然后我看到了同样的模式,实际上这些超时大约每5分钟就会发生一次。我们的网站每隔5分钟就被冻结一段时间,直到分叉手术结束。然后,我发现有一个选项可以每x秒制作一个叉(保存到磁盘):
save 900 1
save 300 10
save 60 10000在我的例子中,它是“保存300 10”--如果至少发生10次更新,每5分钟保存一次。我还发现“叉子”可能很贵。注释“保存”部分根本解决了问题。我们可以评论“保存”部分,因为我们只使用Redis作为“缓存在内存”-我们不需要任何坚持。以下是我们的缓存服务器“Redis2.4.6”窗口端口的配置:https://github.com/rgl/redis/downloads
也许在MSOpentech:http://msopentech.com/blog/2013/04/22/redis-on-windows-stable-and-reliable/中的Redis端口的最新版本中已经解决了这个问题,但我还没有进行测试。
无论如何,StackExchange.Redis与这个问题无关,在我们的生产环境中,它的工作非常稳定,这要感谢Marc。
最终更新: Redis是单线程解决方案--它最终是快速的,但是当涉及到释放内存(删除陈旧或过期的项)时,出现问题的原因是一个线程应该回收内存(这不是快速操作--不管使用什么算法),并且同一个线程应该处理GET、SET操作。当然,当我们谈到中等负荷的生产环境时,就会发生这种情况。即使在达到内存障碍时使用带有从节点的群集,它也会有相同的行为。
发布于 2018-11-11 06:54:08
在大多数情况下,这个异常都是客户端问题。早期版本的StackExchange.Redis直接使用Win32套接字,有时会产生负面影响。可能Asp.net内部路由以某种方式与之相关。
好消息是StackExchange.Redis. infra的网络最近被彻底改写了。最后一个版本是2.0.513。试一试,你的问题就很有可能解决。
https://stackoverflow.com/questions/22930856
复制相似问题