如何解决redis高并发客户端频繁time out?
现在业务上每天有5亿+的请求,平时redis的操作在2K+每秒左右。到了高峰有3K+,这时候客户端就会频繁的报connect time out的异常。
但是,资料上说redis可以达到10W每秒。3K远远不到w这个级别啊,请问有什么建议优化现在的情况么?
答:
redis连接数有多少?是否超过了max open files的限制?
直接top看看redis是否跑满CPU等等。
还有超时时间配置多少等等。
答:你可以把你应用的部署环境描述下,使用什么样的客户端,长连接还是短连接,redis是单机环境还是集群环境,redis是否配置了持久化,什么样的持久化方式,还有就是redis服务器的硬件设施,把这些描述清楚然后再分析原因。
最近刚在一个大型活动中大量使用了Redis,前几次线上高并发模拟的确出现了类似题主的问题。修正方式有二:
1.服务器对TCP和HTTP的限制(直接拒绝或超时)
2.Redis对并发数的限制(maxclients参数,Once the limit is reached Redis will close all the new connections sending an error ‘max number of clients reached‘.)
对了,我的平台是Windows+.Net+Redis(ServiceStack)
Redis的单线程属性
Redis 使用了单线程的设计, 意味着单线程服务于所有的客户端请求,使用一种复用的技术。这种情况下redis可以在任何时候处理单个请求, 所以所有的请求是顺序处理的。这和Node.js的工作方式很像, 所有的产出通常不会有慢的感觉,因为处理单个请求的时间非常短,但是最重要的是这些产品被设计为非阻塞系统调用,比如从套接字中读取或写入数据。
我提到过Redis从2.4版本后几乎是单线程的,我们使用线程在后台运行一些效率低下的I/O操作, 主要关系到硬盘I/O,但是这不改变Redis使用单线程处理所有请求的事实。
总结:就是reids本身性能没有问题,处理并发能力ok,就是跨服务器远程访问其他服务器reids时,并发大了,网络延迟等,会出现取reids卡死。