Redis 异常 read error on connection 的解决方案

目录
  • 一、造成原因与场景
  • 二、出现原因
    • 1)原因1 使用了已经断开的连接
    • 2)原因2:执行超时
  • 三、解决方案
    • 1)如果是原因1
    • 2)如果是原因2:修改超时时间

一、造成原因与场景

在接口连接 redis 时,使用了 pconnect 进行 redis 长连接,在 Redis->auth() 中抛出异常:

PHP Fatal error:  Uncaught exception 'RedisException' with message 'read error on connection' 

注:由于 php-fpm 对连接的重用性,所以,当存在cgi进程管理器[如php-fpm,spawn-cgi],使用 pconnect 效率比 connect 高。但是由于每个持久连接会占用内存,当并发量很大的时,很可能造成内存吃紧

二、出现原因

通过 pconnect 的 redis 长连接不会主动释放,会一直保持在php-fpm进程中,等待完成下一个请求的任务,即使通过 close 也仅是使当前php不能再进行redis请求,但无法真正关闭redis长连接,连接在后续请求中仍然会被重用,直至fpm进程生命周期结束。

这样会出现以下两种情况:

1)原因1 使用了已经断开的连接

假如这个连接已经断开了,下个请求可能直接使用上个断开的连接,当 php-fpm 处理下一个请求 reuse 一个断开的连接可能导致 read error on connection 的异常,以下是 phpredis 源码的解释:

2)原因2:执行超时

  • a)客户端设置的超时时间过短导致的;
  • b)客户端未设置超时时间,但是服务端执行时间超过了默认超时时间设置

php 有一个配置项 default_socket_timeout 表示一个 socket 连接的超时时间,默认是60s,而phpredis 这个扩展的底层连接 redis 是使用的 socket,所以当一个连接在60秒内没有被使用的时候,下次连接就会抛出这个异常。

三、解决方案

1)如果是原因1

长连接改为短连接 或者 在 pconnect 中增加超时时间

$this->redis->pconnect($host, $port, 2);       //@todo 2秒后该连接超时,将使用新的长连接

2)如果是原因2:修改超时时间

(不推荐) 方案1:

php.ini 中设置

default_socket_timeout = -1

然后重启php-fpm

方案2:

动态修改 php.ini

ini_set('default_socket_timeout', -1); // 不超时

方案3:

设置 redis 的超时时间为不超时:

$this->redis->setOption(Redis::OPT_READ_TIMEOUT, -1);

到此这篇关于Redis 异常 read error on connection 的解决方案的文章就介绍到这了,更多相关Redis 异常 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • redis分布式Jedis类型转换的异常深入研究

    目录 1 类型转换异常场景 多线程环境 单线程环境 2 Jedis类型转换异常案例 2.1 案例介绍 2.2 Jedis原理介绍 2.3 类型转换异常的原因 3 Jedis类型转换异常的解决办法 4 问题深思 1 类型转换异常场景 我们在使用Jedis的时候,经常会出现类型转换异常,有如下情况: 多线程环境 Jedis是线程不安全的,如果存在多线程使用同一个Jedis,就会出现类型转换异常网上也流传着很多错误的解释,下面我们以一个案例来复现下这个问题,这个很好理解. 单线程环境 即使在单线程的情

  • dubbo服务使用redis注册中心的系列异常解决

    目录 前言 1.不支持带密码,设置indexdb的reids 解决方法: 二,集群容错模式异常 三,jedis连接池连接的坑 四,服务超过8个应用启动卡死 文末结语 前言 dubbo支持zookeeper,reids,multicast等注册中心注册服务信息,使用redis作为注册中心时,因为reids作为注册中心使用并不广泛,早期reids由于定位内网访问,使用密码验证也不怎么重视,导致框架本身设计缺陷,会有很多坑,如1.没有考虑到带密码验证的redis,2.集群容错模式判断错误 3.不可以设

  • Redis缓存三大异常的处理方案梳理总结

    目录 前言 一.背景 二.缓存雪崩 (一)是什么 (二)为什么 (三)怎么办 三.缓存击穿 (一)是什么 (二)为什么 (三)怎么办 四.缓存穿透 (一)是什么 (二)为什么 (三)怎么办 五.其他 (一)缓存预热 (二)缓存降级 六.总结 前言 Redis作为一个高性能的内存中的key-value数据结构存储系统,在我们日常开发中广泛应用于缓存.计数器.消息队列.排行榜等场景中,尤其是作为最常用的缓存方式,在提高数据查询效率.保护数据库等方面起到了不可磨灭的作用,但实际应用中,可能会出现一些R

  • 在SpringBoot中注入RedisTemplate实例异常的解决方案

    目录 注入RedisTemplate实例异常 贴出详细的错误日志 最后想再验证一个小的问题 注入RedisTemplate实例异常 最近,在项目开发过程中使用了RedisTemplate,进行单元测试时提示 Field redisTemplate in com.example.demo1.dao.RedisDao required a bean of type ‘org.springframework.data.redis.core.RedisTemplate’ that could not b

  • Redis异常测试盘点分析

    目录 Redis测试中的异常 一.更新 Key 异常 二.Key的删除和丢失 三.KEY 过期策略不当造成内存泄漏 四.查询Redis异常时处理 五.redis 穿透.击穿.雪崩 六.Redis死锁 SET Key UniqId Seconds 分布式Redis锁:Redlock 七.Redis持久化 八.缓存与数据库双写时的数据一致性 Redis测试中的异常 在测试工作中,涉及到与 redis 交互的场景变的越来越多了.关于redis本身就不作赘述了,网上随便搜,本人也做过一些整理. 今天只来

  • 如何解决redis的NOAUTH Authentication required异常

    前言 最近学习中需要使用redis,于是在window上安装了一个redis(其实是我搞不好虚拟机和本地连接,于是放弃了虚拟机安装redis).一开始使用还很正常,也没有设置密码,按照网上所说的启动服务,然后打开可视化工具RedisDesktopManager,连接上了,在java中使用也正常.但是第二天的重启电脑的时候,运行java连接程序却在怎么也连不上.显示 NOAUTH Authentication required 需要密码认证的异常. 到网上查了一下有人说是配置文件中的require

  • 关于Springboot2.x集成lettuce连接redis集群报超时异常Command timed out after 6 second(s)

    背景:最近在对一新开发Springboot系统做压测,发现刚开始压测时,可以正常对redis集群进行数据存取,但是暂停几分钟后,接着继续用jmeter进行压测时,发现redis就开始突然疯狂爆出异常提示:Command timed out after 6 second(s)...... Caused by: io.lettuce.core.RedisCommandTimeoutException: Command timed out after 6 second(s) at io.lettuce

  • Redis连接超时异常的处理方法

    0.问题描述 使用Jedis连接redis进行数据查询操作,正常的代码运行没有问题,但是时不时会报出如下错误: Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out  at redis.clients.util.RedisInputStream.ensureFill(RedisI

  • Redis 异常 read error on connection 的解决方案

    目录 一.造成原因与场景 二.出现原因 1)原因1 使用了已经断开的连接 2)原因2:执行超时 三.解决方案 1)如果是原因1 2)如果是原因2:修改超时时间 一.造成原因与场景 在接口连接 redis 时,使用了 pconnect 进行 redis 长连接,在 Redis->auth() 中抛出异常: PHP Fatal error: Uncaught exception 'RedisException' with message 'read error on connection' 注:由于

  • Spring @Cacheable redis异常不影响正常业务方案

    背景 项目中,使用@Cacheable进行数据缓存.发现:当redis宕机之后,@Cacheable注解的方法并未进行缓存冲突,而是直接抛出异常.而这样的异常会导致服务不可用. 原因分析 我们是通过@EnableCaching进行缓存启用的,因此可以先看@EnableCaching的相关注释 通过@EnableCaching的类注释可发现,spring cache的核心配置接口为:org.springframework.cache.annotation.CachingConfigurer /**

  • redis requires ruby version2.2.2的解决方案

    今天在做Redis的Cluster集群的时候,在执行gem install redis时,提示如下错误: gem install redis     ERROR:  Error installing redis:      redis requires Ruby version >= 2.2.2. CentOS7 yum库中ruby的版本支持到 2.0.0,可gem 安装redis需要最低是2.2.2,采用rvm来更新ruby: 1.安装RVM(具体命令可以查看官网,Ruby官网地址和 Ruby

  • 浅谈Redis跟MySQL的双写问题解决方案

    目录 写在前面 三种读写缓存策略 Cache-AsidePattern(旁路缓存模式) Read-Through/Write-Through(读写穿透) WriteBehindPattern(异步缓存写入) 旁路缓存模式解析 CacheAsidePattern的一些疑问 CacheAsidePattern的缺陷 项目中有遇到这个问题,跟MySQL中的数据不一致,研究一番发现这里面细节并不简单,特此记录一下. 写在前面 严格意义上任何非原子操作都不可能保证一致性,除非用阻塞读写实现强一致性,所以缓

  • Golang错误处理方式异常与error

    目录 一.异常 二.错误 Go 提供了两种处理错误 方式, 一 种是借助 panic和 recover 的抛出捕获机制, 另一种使用error 错误类型 一.异常 1.go没有try/catch,而是使用panic/recover. panic包出异常,后续代码不再执行 recover再defer中捕获异常,使groutine(即程序)能够正常退出. 1)只有panic,而没有recover,程序宕机无法正常退出 package main import "fmt" func send(

  • Eclipse中maven异常Updating Maven Project的统一解决方案

    现在使用maven的公司和团队越来越多,虽然没有Gradle那么灵活,但是现对于以前的项目构建方式还是很有优势的,下面分享一个maven update 时的异常统一解决方案: 异常案例: 1.An internal error occurred during: "Updating Maven Project". > Unsupported IClasspathEntry kind=4 2.java.lang.IllegalArgumentException 其他的我就不列举了 解

  • PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法

    其实,这是一个非常容易解决掉的问题.在我看来,似曾相识,呵呵,最近学JavaScript可是学会了使用var声明变量. 其实,在PHP中根本不需要使用var声明的,但是当一个变量作为一个类的成员变量的时候,使用var还是没有问题的. 在外部使用var就报错Parse error: syntax error, unexpected T_VAR in...,例如我的出错信息: Parse error: syntax error, unexpected T_VAR in D:\Apache2.2\ht

  • Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案

    Python IDLE 错误描述: Subprocess Startup Error IDLE's subprocess didn't make connection. Either IDLE can't start a subprocess or personal firewall software is blocking the connection. 错误截图: 错误原因分析: 同层目录下存在和Python库文件相同名字的.py文件,导致子进程无法创建的问题. 解决方法: 排查目录下的.p

  • Redis主从集群切换数据丢失的解决方案

    一.数据丢失的情况 异步复制同步丢失 集群产生脑裂数据丢失 1.异步复制丢失 对于Redis主节点与从节点之间的数据复制,是异步复制的,当客户端发送写请求给master节点的时候,客户端会返回OK,然后同步到各个slave节点中. 如果此时master还没来得及同步给slave节点时发生宕机,那么master内存中的数据会丢失: 要是master中开启持久化设置数据可不可以保证不丢失呢?答案是否定的.在master 发生宕机后,sentinel集群检测到master发生故障,重新选举新的mast

随机推荐