公司项目使用了redis作为缓存数据库,在网上看了很多文章,都指出StackExchange.Redis最好使用单例模式,然而在实际 项目使用过程中,捕捉到timeout事件,如下:
1 | Timeout performing EXISTS UserKey-36700, inst: 1, queue: 1, qu: 0, qs: 1, qc: 0, wr: 0, wq: 0, in: 4, ar: 0, clientName: , serverEndpoint: 10.66.205.72:6379, keyHashSlot: 15122 (Please take a look at this article for some common client-side issues that can cause timeouts: http://stackexchange.github.io/StackExchange.Redis/Timeouts) |
根据异常提到的连接:
http://stackexchange.github.io/StackExchange.Redis/Timeouts)
以及在网上查找StackExchange.Redis timeout相关的文章,发现其中两点个解决方法(也是官方提出的方式):
- 使用ConnectionMultiplexer Pool
客户端中使用 ConnectionMultiplexer 对象池,并在发送新请求时选择“最小化加载”ConnectionMultiplexer。 这样可能会防止单个超时导致其他请求也超时。客户端中使用 ConnectionMultiplexer 对象池,并在发送新请求时选择“最小化加载”ConnectionMultiplexer。 这样可能会防止单个超时导致其他请求也超时。
- 修改线程池的最小设置
建议将 IOCP 和 WORKER 线程的最小配置值设置为大于默认值的值。 我们不能给出一个大小适合所有指导这个值应该是什么,因为一个应用程序的正确价值将太高/低为另一个应用程序。
此设置也会影响复杂应用程序的其他部分的性能,因此您需要根据您的特定需求调整此设置。
一个好的起点是200或300,然后根据需要进行测试和调整。
调整方式:System.Threading.ThreadPool.SetMinThreads(200, 200);