获取连接失败 Could not get a resource from the pool
场景描述
在C端项目上线后遇到高并发场景,后台持续报警,获取不到redis连接,此时单机redis最大连接数为10,经排查,发现该业务场景的静态资源均存放于redis中,每个用户请求都会去redis获取数据,导致高并发场景下,获取连接的速度大于释放连接的速度,导致了此异常
解决方案
转移部分静态资源至本地缓存中,每个实例保存一份,减少redis压力
后续复盘
在经过第一轮优化后,发现扔会出现此情况,于是将单实例最大连接数调整至50,系统不再报错,在高并发场景下需要慎重考虑分布式缓存与本地缓存的应用场景,不可一味使用分布式缓存,以及需要考虑redis适合的连接数,保证功能正常运行
高并发场景下谨慎使用分布式锁
场景描述
在上述场景下,线程池打满,服务器报错 Thread pool is EXHAUSTED...Pool Size:200,经排查发现在队列任务中,每一个任务自选获取分布式锁,锁释放速度小于获取锁的速度,导致大量请求累积在线程池中,造成异常
解决方案
讲队列中锁取消掉,根据业务需求决定使用公平锁或非公平锁模式,不需要额外分布式锁
缓存击穿
场景描述
上述场景中,某一个业务需要根据userId查询数据,并放入缓存中,下次进入时将命中缓存,高并发时,由于代码疏漏没有将第一次的结果放入缓存中,导致大量请求同时进入数据库,导致数据库连接超时
解决方案
调整代码,将数据写入缓存,并设置合理的过期时间,防止缓存雪崩&击穿
改进后压测情况
后记
修改配置文件调整最大连接数
redis 2.6之后版本,在redis.conf配置文件中修改最大连接数配置,默认10000
maxclients 10000
设置redis允许的最大连接数
127.0.0.1:6379> CONFIG set maxclients 10
OK
127.0.0.1:6379>
服务端最大连接数设置
启动 redis.service 服务时加参数 --maxclients 100000 来设置最大连接数限制
redis-server --maxclients 100000 -f /etc/redis.conf
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。