gpt4 book ai didi

c# - ServiceStack PooledRedisClient超时异常

转载 作者:IT王子 更新时间:2023-10-29 06:04:35 25 4
gpt4 key购买 nike

我在 servicestack API 中使用 ServiceStack.Redis 池客户端,经过几个小时的流量(约 3000rpm)后,我从池管理器收到连接超时异常。实现如下:

在 AppStart 中:

 container.Register<IRedisClientsManager>(
p => new RedisManagerPool(Configuration.Config.Instance.RedisConfig.Server)
{
MaxPoolSize = 10000,
PoolTimeoutMs = 2000
}).ReusedWithin(ReuseScope.Container);

在服务中:

Pool = (RedisManagerPool) GetResolver().TryResolve<IRedisClientsManager>();
RedisClient = (RedisClient)Pool.GetClient();

....

RedisClient.Dispose();

我还尝试使用 Pool.DisposeClient(RedisClient) 来处理客户端,以便将客户端返回到池中,但我看到了相同的结果。

我还检查了 Redis 服务器,但在 cpu 使用、内存使用、0 拒绝连接等方面没有问题。

如果有人遇到过,请告诉我一下好吗?

谢谢

最佳答案

我不会有这么大的池大小,保持 10000 开放连接似乎比根本没有任何连接池更糟糕。

您也不需要指定 ReuseScope.Container,因为默认是使用单例,这是经理/工厂的正确范围,所以我会首先尝试默认配置:

container.Register<IRedisClientsManager>(c => 
new RedisManagerPool(Configuration.Config.Instance.RedisConfig.Server));

池超时异常表明连接池已满,并且在池超时内没有释放(即处置)任何连接。

我推荐使用最新的RedisManagerPool v4.0.34 that's on MyGet有一个备用池策略,一旦连接池已满,将创建新的非托管池实例,而不是在达到池超时后锁定和抛出。

同样在您的服务中,您可以使用 base.Redis 访问 Redis 客户端 since it automatically creates an instance首次访问并在服务执行后处置时,即:

public class Service : IDisposable
{
private IRedisClient redis;
public virtual IRedisClient Redis
{
get { return redis ?? (redis = TryResolve<IRedisClientsManager>().GetClient()); }
}

//...

public virtual void Dispose()
{
if (redis != null)
redis.Dispose();
}

}

这有助于确保在每次请求后正确处理 Redis 客户端。

关于c# - ServiceStack PooledRedisClient超时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27177906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com