加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

记一次找因Redis使用不当导致应用卡死Bug的过程

发布时间:2019-10-14 00:39:00 所属栏目:MySql教程 来源:小木
导读:副标题#e# 首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象 刚开始当测试抱怨环境响应慢的时候 ,我们重启一下应用,应用恢复正常,于是没做处理。但是后来问题出现频率越来越频繁,越来越多的同事开始抱怨,于是感觉代码可能

发现以下代码..

  1. .....  
  2. Cursor c = stringRedisTemplate.getConnectionFactory().getConnection().scan(options);  
  3. while (c.hasNext()) {  
  4. .....,,  
  5.    } 

分析这个代码,stringRedisTemplate.getConnectionFactory().getConnection()获取pool中的redisConnection后,并没有后续操作,也就是说此时redis 连接池中的链接被租赁后并没有释放或者退还到链接池中,虽然业务已处理完毕 redisConnection 已经空闲,但是pool中的redisConnection的状态还没有回到idle状态

记一次找因Redis使用不当导致应用卡死Bug的过程

正常应为

记一次找因Redis使用不当导致应用卡死Bug的过程

自此问题已经找到。

总结:spring stringRedisTemplate 对redis常规操作做了一些封装,但还不支持像 Scan SetNx等命令,这时需要拿到jedis Connection进行一些特殊的Commands

使用

  1. stringRedisTemplate.getConnectionFactory().getConnection() 

是不被推荐的

我们可以使用

  1. stringRedisTemplate.execute(new RedisCallback<Cursor>() {  
  2.      @Override  
  3.      public Cursor doInRedis(RedisConnection connection) throws DataAccessException {  
  4.        return connection.scan(options);  
  5.      }  
  6.    }); 

来执行,

或者使用完connection后 ,用

  1. RedisConnectionUtils.releaseConnection(conn, factory); 

来释放connection.

同时,redis中也不建议使用keys命令,redis pool的配置应该合理配上,否则出现问题无错误日志,无报错,定位相当困难。

【编辑推荐】

  1. 关于MySQL数据库配置优化的15条建议
  2. 公司有一台很重要SQL数据库,如何实现数据库实时同步?
  3. 到底要不要使用数据库即服务(DBaaS)?
  4. 国产自研数据库打败 Oracle?网友热议
  5. 什么?Redis的QPS是MySQL的100倍?
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读