先把解决方案写在最前边:
如果Redis客户端显示标题中所示的这个信息,

在/etc/sysctl.conf 添加一项 'vm.overcommit_memory = 1’ ,然后重启,即可解决问题。

另外,最重要的是要学会查看redis的错误日志,这个是需要我们自己配置的(这个很重要),步骤如下:

①打开redis.conf文件,找到logfile,初始状态如下:

查看redis 错误日志 怎么查看redis日志_缓存


②默认是空串,在双引号中加入自己设置的日志路径(下边是我的配置)

查看redis 错误日志 怎么查看redis日志_redis_02


③用此配置文件重新启动redis,即可查看错误日志。

以下是我的解决问题的过程

问题描述:

最近在做一个项目,但进行到准备将采集到的日志数据写入Redis进行去重操作时,遇到了问题,如下:

redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool

根据字面意思理解,报错是因为无法从Redis连接池中获取连接;除此之外,错误日志里显示了导致此错误的代码的位置,如下:

//获取Jedis客户端
  def getJedisClient(): Jedis = {
    if (jedisPool == null) {
      build()
    }
    jedisPool.getResource
  }
//每一个分区获取一次Redis的连接
        val jedis: Jedis = MyRedisUtil.getJedisClient()

与上述描述保持一致,就是连接池的问题。

问题分析:

因为错误日志反复提到无法获取redis连接,因此我首先检查了代码,是不是代码写得有问题,经检查是没有问题的,而且Redis连接工具类前两天写完,当时测试过的,没有问题
于是我上网查资料,
尝试1:
看到有帖子说是不是忘记释放连接导致的,我代码里明确写了关闭连接,执行jedis.close();接着我又按照他的操作,将redis的超时时间进行设置:
在redis控制台输入:config get timeout得到:timeout 0

0说明没有开启超时时间

输入:config set timeout 600
但没用。
尝试2:
然后有帖子提示是不是没有设置redis最大连接数导致的,但是我之前这些都是设置过的,且之前测试没有问题,

jedisPoolConfig.setMaxTotal(100) //最大连接数
    jedisPoolConfig.setMaxIdle(20) //最大空闲
    jedisPoolConfig.setMinIdle(20) //最小空闲
    jedisPoolConfig.setBlockWhenExhausted(true) //忙碌时是否等待
    jedisPoolConfig.setMaxWaitMillis(5000) //忙碌时等待时长 毫秒
    jedisPoolConfig.setTestOnBorrow(true) //每次获得连接的进行测试

尝试3:
多次尝试无果,这是我才想起测试下工具类还可以正常使用吗(因为我前两天才测过没有问题,所以就没想这个),果不其然,显示无法获取连接,正常情况应该显示PONG的。
于是我通过xshell进入redis客户端,输入ping,终于出现了最关键的问题,即标题中介绍:

MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk

意为:
Redis被配置为保存数据库快照,但它目前不能持久化到硬盘。用来修改集合数据的命令不能用。请查看Redis日志的详细错误信息。
且*此时redis客户端时无法正常操作的,无法正常关闭,无法执行查询key 的操作。
因为错误信息中显示检查redsi日志,于是查看日志,显示:

WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

意为:

过量使用内存设置为0!在低内存环境下,后台保存可能失败。为了修正这个问题,请在/etc/sysctl.conf 添加一项 'vm.overcommit_memory = 1’ ,然后重启。

于是我按照上述进行操作,果然解决问题,

查看redis 错误日志 怎么查看redis日志_数据库_03


查看redis 错误日志 怎么查看redis日志_redis_04


终于成功!!!

一些小经验:

其实一开始出现连接错误,就应该测试工具类是不是可以正常运行,可以节省很多时间,但是我想当然的认为前几天正常运行,不会出问题,结果浪费了很多时间。
另外就是错误日志中会提示很多信息,例如程序出错的位置,以及Redis错误日志的信息,都为我们解决问题提供了思路