【redis】记一次性能排查记录

最近遇到了系统登录、加载等特慢的问题

经过排查大致锁定了是redis查询慢的问题

于是对redis性能进行了排查

测试延迟、网络

首先在可连接redis服务器的机器上,(前提是有redis-cli工具)使用命令

redis-cli -h xxx.xxx.xxx.xxx(或者域名) -p 6379 -a xxx(认证密码) --latency

测试redis延迟,一般来说avg小于0.3可视为正常

redis-cli -h xxx.xxx.xxx.xxx(或者域名) -p 6379 -a xxx(认证密码)

查询内存使用情况

进入redis连接,使用info memory命令查询内存使用情况

微信图片_20210729090053.png

  • used_memory:表示Redis分配器分配的内存总量,以字节(byte)为单位,
    used_memory_human表示以人能看懂的形式展示内存总量
  • used_memory_rss:表示从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)
  • used_memory_peakRedis 的内存消耗峰值
  • mem_allocator:在编译时指定的, Redis 所使用的内存分配器。可以是 libc 、 jemalloc 或者 tcmalloc
  1. 当 rss > used ,且两者的值相差较大时,表示存在(内部或外部的)内存碎片。
    内存碎片的比率可以通过 mem_fragmentation_ratio 的值看出。

  2. 当 used > rss 时,表示 Redis 的部分内存被操作系统换出到交换空间了,在这种情况下,操作可能会产生明显的延迟。

慢查询查看

上面步骤下来看到redis应该也挺正常的,那系统为什么卡呢,继续执行下面的命令

slowlog get 20

获取最近20条执行慢的查询
可配置慢查询阈值,超过该时间的查询视为慢查询并记录

CONFIG SET slowlog-log-slower-than 10000

默认slowlog-log-slower-than值为10000微秒=10ms

查询结果如下:

sd.png

好家伙,结果发现这么多通过通配符查询token的命令,赶紧去代码里全局搜了一遍,结果发现代码里有个通过用户ID获取token的方法,写的是先通配符获取所有token,然后通过key取里面的userid与自身进行对比。并且该方法使用的地方也不少。
用膝盖想就知道性能极差,于是便对方法进行了优化,尽量减少这种情况的调用,解决后重新测试果然快了不少。