首次使用Redis记录【3】

根据上文配置使用后 数据库

会出现以下问题:this

    this.jedis = this.jedisPool.getResource();方法长时间无响应且控制台不报错,方法堵塞。对象

 实际状况:事务

    大概调用了该方法八九次以后就会开始堵塞,无响应。资源

缘由:相似数据库链接池获取事务或者IO流对象,用完以后须要关闭。 文档

解决:每次使用完资源以后关闭资源,this.jedis.close()后便可。get

 

网上参考:it

 

jedisPool.getResource()方法长时间无响应而且不报错,方法阻塞for循环

  这个锅真的是蓝瘦,,,表现是项目重启后一开始能够,过段时间,哎,不行了,,,,查了一半天发现,缘由在于jedis链接用完了,而后默认给阻塞了,而后直到得到链接。看下个人错误代码配置

//得到链接
Jedis jedis = jedisPool.getResource();
log.info("get jedis success");
jedis.set(wlId, encryUser);
jedis.expire(wlId,1800);

而后我跑了200个for循环,调用他,排查错误,大概就是到48次的时候,阻塞掉了,不报错也没反应,说明jedis链接池在我电脑配置上是开了48个之内。
查看他的官网文档,其中有一段new JedisCluster(hpset, 30)中默认了MaxWaitMillis为-1。,

BlockWhenExhausted:链接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
MaxWaitMillis:获取链接时的最大等待毫秒数(若是设置为阻塞时
BlockWhenExhausted,若是超时就抛异常,小于零:阻塞不肯定的时间, 默认-1

BlockWhenExhauste这个方法默认参数-1,就是说当阻塞的时候我阻塞多久啊,默认永久阻塞。而一开始没有阻塞是由于一开始链接并无耗尽,这个就是缘由所在。我们修改配置使得阻塞短期或者不阻塞或者在你用完jedis的时候关闭链接就行了啊,具体状况视你的业务场景而定,我是把个人链接给关闭了。
  修改后的代码

//得到链接 Jedis jedis = jedisPool.getResource(); log.info("get jedis success"); jedis.set(wlId, encryUser); jedis.expire(wlId,1800); //用完后乖乖的关掉,就是由于它 jedis.close();

相关文章
相关标签/搜索