Stay hungry Stay foolish

Redis军规

Posted on By Will Lee

  • content

现象

生产环境碰到了性能问题,应用有如下症状:

  1. Redis cpu突然上升到100%
  2. 所有应用节点pod全部挂掉重启
  3. php-fpm达到最大线程限制

定位过程

  1. 看到Redis有排队的请求,连接数突然飙高十倍,但OPS还算正常,请求处理正常
  2. 应用节点在Redis cpu达到100%后7分钟左右则全部挂掉
  3. 所有节点的心跳检测失败

最终发现是在商品修改价格时会频繁操作Redis,当前代码逻辑是商品循环修改Redis中的数据,但是中间使用了Redis::keys方法,这一行代码就阻塞了Redis 0.8s,这样循环1000次就是阻塞了800s(由于Redis是单进程处理请求),导致正常的请求无法处理而阻塞,进而导致php无能力处理心跳请求而最终挂掉

  • Redis军规

下面的军规写的就比较好了,还是要强调禁止使用Redis::keys方法,同时多条命令建议使用pipline

Redis军规: https://learnku.com/articles/42487#13fc75