You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:39:00