我是靠谱客的博主 真实中心,最近开发中收集的这篇文章主要介绍redis 从服务器给主服务器发送ACK时,主服务器长时间不读取socket,则会出现错误。,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
最近一直在重写redis 源码,在调试时发现一个错误:
错误发生的场景如下:
从服务器不下断点,而主服务器的断点一直卡在,readQueryFromClient函数中的read函数之前。
在这种情况下,从服务器会一直向主服务器发送ACK,直到socket写缓冲区被写满,才停止。而主服务器由于一直被卡在read函数之前,所以socket接收缓冲区(我这缓冲区大小是335KB)的中数据一直没有被读取。这时如果让主服务器执行,它会读取socket接收缓冲区中的数据,而redis默认一次读取16K的数据。
ACK命令的全写是:
*3rn$8rnREPLCONFrn$3rnACKrn$1rn1rn
一共是34个字节,如果接收缓冲区中的数据大于16K时,它在读取最后一条命令时会剩余4个字节没读(34-16*1024/34=4)
如下解释:
在接收缓冲区中的内存内容是这样的:
*3rn$8rnREPLCONFrn$3rnACKrn$1rn1rn*3rn$8rnREPLCONFrn$3rnACKrn$1rn1rn*3rn$8rnREPLCONFrn$3rnACKrn$1rn1rn*3rn$8rnREPLCONFrn$3rnACKrn$1rn1rn............*3rn$8rnREPLCONFrn$3rnACKrn$1r (到这里是16*1024个字节,后面的会在下次被读) n1rn
而下次读的时候读到n1rn,这对于redis来说是一条错误的命令,所以redis会报错说找不到指令。
这种错误只会发生在调试阶段,而正式版之所以不会出现这种错误,应该是对主服务器有超时判断。
最后
以上就是真实中心为你收集整理的redis 从服务器给主服务器发送ACK时,主服务器长时间不读取socket,则会出现错误。的全部内容,希望文章能够帮你解决redis 从服务器给主服务器发送ACK时,主服务器长时间不读取socket,则会出现错误。所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复