redis生产环境中慎用keys模糊匹配方法

Redis是一个key-value存储系统。和Memcached类似,但性能远高于memcached。现在很多大型互联网公司都在使用redis作为自己的缓存实现,但是如果没有合理使用好redis,比如频繁调用keys,info等方法,那么会出现很严重的性能问题,以下就是我的真实情况。

  首先我的系统的中使用了spring data redis中的一个redisTemplate.keys()方法,用来模糊匹配,开始在测试时,满足一切的开发功能,部署到线上后,过了大概半天,服务器出现了很高的延迟,通过aws的console观察延迟比平时高七八倍左右。boss打电话来让我查看问题出现的原因在哪里。

  首先,我观察工程的日志,看到最多的就是jedis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool这个异常,而且很多是read timeout,首先我就是加大redis.clients.jedis.JedisPoolConfig中的maxTotal属性的值,改了后问题依旧,这时我就估计是不是redis.clients.jedis.JedisPoolConfig中的maxWaitMillis属性设置小了,我这边设置的是5000,加大后还是出现上面的异常问题,百思不得其解,我登陆到redis服务器上info命令下一切都比较正常,这时我注意到了cpu比平时高很多,达到了50以上,平时都在10左右,马上用monitor命令看了一下,出现了很多keys方法调用,马上搜索了下keys的性能问题,得到很多的回答就是

  KEYS * 命令,当数据规模较大时使用,会严重影响Redis性能,也非常危险立马改掉项目中使用redisTemplate.keys()这个方法,改了后立马cpu降下来,延迟恢复正常,而且控制台中也没有read time out,connect time out 等异常信息了。

你可能感兴趣的:(redis)