我在一些 .NET Web 应用程序上工作,这些应用程序大量使用 Redis 以及 ServiceStack 的 Redis 客户端进行缓存。在所有情况下,我都让 Redis 在同一台机器上运行。我已经使用了BasicRedisClientManager和PooledRedisClientManager(总是作为单例实现)并且这两种方法都有一些问题。
使用BasicRedisClientManager,一段时间内一切正常,但最终 Redis 会开始拒绝连接。使用 netstat,我们发现到默认 Redis 端口的数千个 TCP 连接处于 TIME_WAIT 状态。
然后我们切换到PooledRedisClientManager,这似乎可以立即解决问题。然而,不久之后,我们开始注意到偶尔的 CPU 峰值,我们将其缩小为由 PooledRedisClientManager.GetClient 引起的线程等待(System.Threading.Monitor.Wait 调用)。
在代码中,我们使用 get-in-get-out 方法(使用 ServiceStack 方便的 ExecAs 快捷方式),因此通常会非常频繁地获取连接,但要尽可能简短地保持连接。
我们获得了适量的流量,但我们不是 StackExchange,我不禁认为 ServiceStack 客户端可以胜任这项工作,而我们只是做错了。PooledRedisClientManager 是正确的方法吗?是否建议简单地增加池大小?或者这可能只是掩盖了我们代码的问题?
只是在这里寻找一般指导,此时我没有需要帮助的特定代码。提前致谢。