redis相关报错
Posted Natcret
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis相关报错相关的知识,希望对你有一定的参考价值。
Redis 突然间不能访问,返回如下错误:
1 redis.client.jedis.exception.JedisDataException:MISCONF Redis is configured to save RDB snapshots,
2 but is currently not able to persist on disk.Commands that may modify the data set are disabled.
3 Please check Redis logs for details about the error
解决方法:查看 redis 日志,发现如下错误:Cant save in background:fork:Cannot allocate memory Redis在保存内存的数据到磁盘时,为了防止主线程假死,会Fork 一个子进程来完成这个保存操作,这个Fork 的子进程需要分配与主进程相同的内存,这时候就相当于需要的内存翻倍了。如果这时候可用内存不足以分配需要的内存,将会导致Fork 子进程失败而无法将数据持久化到磁盘。修改Linux内核参数 vm.overcommit_memeory=1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何) 问题便可解决。
Too Many Cluster Redirections
这个错误信息一般在 cluster 环境中出现,主要原因还是单机出现了命令堆积。
Redis 是单线程处理请求的,如果一条命令执行的特别慢(可能是网络阻塞,可能是获取数据量大),那么新到来的请求就会放在 TCP 队列中等待执行。但是等待执行的命令数如果超过了设置的队列大小,后面的请求就会被丢弃。
出现上面这个错误的原因是:
- 集群环境中 client 先通过key 计算 slot,然后查询 slot 对应到哪个服务器,假设这个 slot 对应到 server1,那么就去请求 server1。
- 此时如果 server1 整由于执行慢命令而被阻塞且 TCP 队列也已满,那么新来的请求就会直接被拒绝。
- client 以为是 server1不可用,随即请求另一个服务器 server2。server2 检查到该 slot 由 server1 负责且 server1 心跳检查正常,所以告诉 client 你还是去找 server1 吧。
- client 又来请求 server1,但是 server1 此时还是阻塞中,又回到 3。当请求的次数超过拒绝服务次数之后,就会抛出异常。
大命令要不得。对于这种错误,最首要的就是要优化存储结构或者获取数据方式。其次,增加 TCP 队列长度。再次,扩容也是可以解决的。
以上是关于redis相关报错的主要内容,如果未能解决你的问题,请参考以下文章
springcloud报错-------关于 hystrix 的异常 FallbackDefinitionException:fallback method wasn't found(代码片段
错误记录Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. | Android Studio 降级 )(代码片段
错误记录Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. | Android Studio 降级 )(代码片段
Flutterflutter doctor 报错Android license status unknown. Run `flutter doctor --android-licenses‘(代码片段
解决移动端报错:Unable to preventDefault inside passive event listener due to target being treated as……(代码片段