问题
- 在正常使用接口时,发现只要有redis相关操作就发现明显速度慢,在局域网环境redis操作时快时慢极其不稳定
问题排查与解决方案
- 因为redis处理命令的运行时是单线程,怀疑存在非常耗时的命令,如:
key *等
- slow log中无任何数据
- 宿主机CPU、内存、磁盘的每秒
idle都在90%以上
- 开始查看redis监控
罪魁祸首出现,
xread BLOCK 100 COUNT 100 STREAMS ...!最多堵塞100ms,最多读取100条流数据即返回。(注意这只是堵塞的redis客户端,在堵塞期间redis服务端仍然能够处理其他命令)既然知道是因为ioredis客户端导致的原因,所以两种解决办法
- redis连接池,因为项目使用
ioredis所以不存在连接池(利用redis pipeline能力提升并发效率)- socket.io redis stream adapter 使用单独的ioredis客户端 👍
优化提升
从800~1200ms提升到50ms以内,优化了接近20倍,redis高频接口效果异常明显