现象
做期权夜盘时,对cpp_redis管理类做了修改,程序运行不到1小时就出现断连崩溃,报错如下:
过程
-
各种修改尝试,始终找不到原因,没有找到问题关键
开始以为是将redis管理类改为了单例导致的问题,修改之后仍然没有效果
百度相关问题,发现用cpp_redis的人实在太少,没有可以参考的用例
查看redis的日志,都是正常的刷新数据的日志,没有和连接相关的内容
去看cpp_redis源码中example的实例,发现都是非常简单的用法,和自己的使用相差不大
这个问题从库这方面找问题真的无从插手。于是转换角度,从tcp连接上找问题 -
既然报了tcp_client is disconnected错误,说明和redis的连接出现了某些问题。程序运行时,执行如下命令 netstat -anp | grep 6379 如下图所示。这个命令的几列数据意义如下 :
- proto:网络传输协议
- Recv-Q :数据已经在本地接收缓冲区,但是还没有recv()
The count of bytes not copied by the user program connected to this socket.
单位是字节,是表示程序总共还有多少字节的数据没有从内核空间的套接字缓存拷贝到用户空间 - Send-Q:对方没有收到的数据或者说没有Ack的,还在本地缓冲区
- Local Address :本地地址
- Foreign Address:外部地址
Recv-Q和Send-Q正常情况下都为0,但从下图看到,Recv-Q和Send-Q都在不断的变大,显然是有问题的。确定问题是出在redis相关代码上。
修改
通过review代码发现,在get函数取值时的回调函数中发生了崩溃,如下图函数以及修改
修改后的效果
发送队列和接收队列都为0,经验证,崩溃解决