Redis客户端get操作响应耗时超1秒问题求助
分析cpp_redis中
get.get()耗时过长的问题 我来帮你捋捋这个问题哈!从你的测试输出能明显看到,redis_client->get(key)几乎瞬间完成,但调用get.get()等待异步结果却花了近2秒——这说明问题根本不在发送请求的环节,而是卡在等待Redis响应被客户端处理的阶段。结合你的VS2015 x64环境和本地Redis的情况,我给你几个排查方向和解决思路:
1. 最可能的原因:cpp_redis的事件循环没正常跑起来
cpp_redis是异步客户端,它依赖事件循环来处理网络IO(接收Redis的响应、解析数据)。如果你的代码只调用了connect,却没启动事件循环,或者事件循环没有持续运转,那异步任务的结果就会一直处于等待状态,直到超时或者事件循环终于处理了响应。
解决办法:
你需要确保事件循环在后台运行,比如开个线程专门处理:
// 在connect成功后,启动事件循环线程 std::thread redis_io_thread([&]() { while (redis_client->is_connected()) { // 处理待处理的网络事件 redis_client->poll(); // 加个小休眠避免占用过多CPU std::this_thread::sleep_for(std::chrono::milliseconds(1)); } }); // 记得在程序结束时join线程,或者设置为detach redis_io_thread.detach();
或者,如果你是同步调用的场景,也可以在调用get.get()之前主动触发一次事件处理:
auto get_future = redis_client->get(key); // 主动处理网络响应,把Redis的返回结果解析出来 redis_client->poll(); // 现在再get就不会等太久了 auto val = get_future.get();
2. 检查Redis连接是否真的正常建立
虽然你说是本地Redis,但偶尔也会出现连接未完全建立就发送请求的情况。你可以给connect加个回调,确认连接状态:
bool is_connected = redis_client->connect( host, port, [](const std::string& host, std::size_t port, cpp_redis::client::connect_state state) { if (state == cpp_redis::client::connect_state::failed) { std::cerr << "Redis连接失败!" << std::endl; } else if (state == cpp_redis::client::connect_state::dropped) { std::cerr << "Redis连接断开了!" << std::endl; } } ); if (!is_connected) { std::cerr << "初始化Redis连接失败,请检查地址和端口!" << std::endl; return ""; }
另外,连接本地Redis时,尽量用127.0.0.1代替localhost,避免不必要的DNS解析延迟(虽然本地解析很快,但偶尔会有奇怪的问题)。
3. 排查编译和版本问题
- 如果你用的是旧版本的cpp_redis,可能存在Windows平台下的性能bug,建议更新到最新稳定版试试。
- 确认你是用Release模式编译的:Debug模式下,STL和网络库会有大量调试开销,虽然一般不会到2秒,但也有可能放大问题。
4. 确认Redis服务器本身没有阻塞
虽然你的Redis只有200个键,但也可以简单排查下服务器状态:
- 打开
redis-cli,执行GET Control:107:1,看看命令耗时多少。如果redis-cli执行很快,那问题肯定在客户端;如果redis-cli也慢,那就要检查Redis服务器的配置(比如是否开启了慢查询、是否有其他进程占用CPU)。 - 执行
INFO stats看看latest_fork_usec,如果这个值很大,说明Redis最近做了RDB持久化导致阻塞;用INFO commandstats可以查看GET命令的平均耗时。
内容的提问来源于stack exchange,提问作者Mia Shani
相关产品推荐
相关产品推荐

