Redis 高并发场景 获取连接失败 & 击穿 & 锁 等问题复盘

获取连接失败 Could not get a resource from the pool

Redis 高并发场景 获取连接失败 & 击穿 & 锁 等问题复盘_第1张图片

场景描述

在C端项目上线后遇到高并发场景,后台持续报警,获取不到redis连接,此时单机redis最大连接数为10,经排查,发现该业务场景的静态资源均存放于redis中,每个用户请求都会去redis获取数据,导致高并发场景下,获取连接的速度大于释放连接的速度,导致了此异常

解决方案

转移部分静态资源至本地缓存中,每个实例保存一份,减少redis压力

后续复盘

在经过第一轮优化后,发现扔会出现此情况,于是将单实例最大连接数调整至50,系统不再报错,在高并发场景下需要慎重考虑分布式缓存与本地缓存的应用场景,不可一味使用分布式缓存,以及需要考虑redis适合的连接数,保证功能正常运行

高并发场景下谨慎使用分布式锁

Redis 高并发场景 获取连接失败 & 击穿 & 锁 等问题复盘_第2张图片

场景描述

在上述场景下,线程池打满,服务器报错 Thread pool is EXHAUSTED...Pool Size:200,经排查发现在队列任务中,每一个任务自选获取分布式锁,锁释放速度小于获取锁的速度,导致大量请求累积在线程池中,造成异常

解决方案

讲队列中锁取消掉,根据业务需求决定使用公平锁或非公平锁模式,不需要额外分布式锁

缓存击穿

场景描述

上述场景中,某一个业务需要根据userId查询数据,并放入缓存中,下次进入时将命中缓存,高并发时,由于代码疏漏没有将第一次的结果放入缓存中,导致大量请求同时进入数据库,导致数据库连接超时

解决方案

调整代码,将数据写入缓存,并设置合理的过期时间,防止缓存雪崩&击穿

你可能感兴趣的:(redis)