Redis踩坑记-------MISCONF Redis is configured to save RDB snapshots, but is currently not able to pe...

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

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

另外,最重要的是要学会查看redis的错误日志,这个是需要我们自己配置的(这个很重要),步骤如下:
①打开redis.conf文件,找到logfile,初始状态如下:
在这里插入图片描述
②默认是空串,在双引号中加入自己设置的日志路径(下边是我的配置)
在这里插入图片描述
③用此配置文件重新启动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错误日志的信息,都为我们解决问题提供了思路

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南望南山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值