如何解决使用 Servicestack 的 Redis 超时
我们使用服务堆栈作为我们的 RedisClient。
我们的应用每秒处理 50 个以上的请求,当前的架构是 12 个负载均衡的应用实例都连接到单个 Redis 实例,使用 Hangfire 排队获取/设置操作。
我们使用 PooledRedisClientManager 配置如下:
services.AddSingleton<IRedisClientsManager>(p =>
new PooledRedisClientManager(Configuration.GetValue<long>("Redis:DatabaseId"),Configuration.GetValue<string>("Redis:master"))
{
ConnectTimeout = Configuration.GetValue<int>(5000),IdleTimeOutSecs = Configuration.GetValue<int>(30),PoolTimeout = Configuration.GetValue<int>(3)
});
我们的应用程序一直在抛出这个异常:
Redis Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use.
at ServiceStack.Redis.PooledRedisClientManager.GetClient(Boolean forAsync) in C:\BuildAgent\work\b2a0bfe2b1c9a118\src\ServiceStack.Redis\PooledRedisClientManager.cs:line 264
我知道连接到 Redis 的最大客户端数是 10000,而我们只有 594 个连接到 Redis 实例的客户端。
请帮忙
解决方法
您已达到 PooledRedisClientManager
的池大小,当达到其限制时,该池大小会阻塞,直到新客户端被释放回池中,或者如果超时则超时。
您可以通过以下方式配置池大小:
RedisConfig.DefaultMaxPoolSize = ...
或者,您可能希望切换到 RedisManagerPool,当它超过池大小时,将在池外创建/释放客户端,而不是阻塞。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。