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

如何使用C++将int类型std::vector<std::vector<int>>存入Redis缓存

基于redis-plus-plus的二维int向量存储方案

Redis本身为KV类型存储,不原生支持C++ STL嵌套结构的直接写入,需要先对std::vector<std::vector<int>>做序列化转换后再存储,两种常用实现方案如下:

方案1:手动扁平序列化

无需引入第三方依赖,直接将二维向量的元信息(外层长度、各内层长度)和元素值拼接为二进制字符串,存入Redis String类型即可。

  • 序列化代码示例:
std::string serialize_2d_int_vec(const std::vector<std::vector<int>>& input) {
    std::string buffer;
    // 写入外层向量长度
    size_t outer_sz = input.size();
    buffer.append(reinterpret_cast<const char*>(&outer_sz), sizeof(outer_sz));
    // 依次写入每个内层向量的长度
    for (const auto& inner_vec : input) {
        size_t inner_sz = inner_vec.size();
        buffer.append(reinterpret_cast<const char*>(&inner_sz), sizeof(inner_sz));
    }
    // 写入所有int元素值
    for (const auto& inner_vec : input) {
        for (int val : inner_vec) {
            buffer.append(reinterpret_cast<const char*>(&val), sizeof(val));
        }
    }
    return buffer;
}
  • 反序列化代码示例:
std::vector<std::vector<int>> deserialize_2d_int_vec(const std::string& buffer) {
    std::vector<std::vector<int>> result;
    const char* ptr = buffer.data();
    // 读取外层向量长度
    size_t outer_sz = *reinterpret_cast<const size_t*>(ptr);
    ptr += sizeof(outer_sz);
    result.resize(outer_sz);
    // 读取所有内层向量长度
    std::vector<size_t> inner_sizes(outer_sz);
    for (size_t i = 0; i < outer_sz; ++i) {
        inner_sizes[i] = *reinterpret_cast<const size_t*>(ptr);
        ptr += sizeof(inner_sizes[i]);
        result[i].resize(inner_sizes[i]);
    }
    // 读取所有int元素
    for (size_t i = 0; i < outer_sz; ++i) {
        for (size_t j = 0; j < inner_sizes[i]; ++j) {
            result[i][j] = *reinterpret_cast<const int*>(ptr);
            ptr += sizeof(int);
        }
    }
    return result;
}
  • 读写调用示例:
// 写入
auto serialized = serialize_2d_int_vec(your_vec);
redis.set("your_key", serialized);
// 读取
auto val = redis.get("your_key");
if (val) {
    auto your_vec = deserialize_2d_int_vec(*val);
}

注意:该方案默认同一读写端字节序一致,跨平台场景建议补全字节序转换逻辑。

方案2:第三方序列化库

如果不想手动维护序列化逻辑,可引入MsgPack、Protobuf等成熟序列化库,直接将std::vector<std::vector<int>>打包为二进制串,再调用redis-plus-plus的读写接口即可,这类库原生处理字节序、结构兼容问题,更适合生产环境使用。

支持简化嵌套结构存储的其他C++ Redis客户端

如果需要更便捷的STL容器适配能力,可以选择以下客户端:

  • hiredis:最底层的C语言Redis客户端,可在上层封装通用序列化钩子,适配任意STL结构,灵活度最高
  • redi:C++11及以上版本可用的轻量客户端,支持自定义序列化规则注册,注册完成后可直接对std::vector等STL类型做读写,无需每次手动转换
  • cpp_redis:异步支持能力更完善,同样支持自定义序列化器绑定,嵌套结构读写逻辑可以统一封装复用

如果业务场景不需要全量读写二维向量,也可以将每个内层向量作为单独的Redis List结构存储,用key前缀区分不同的内层向量,避免全量序列化/反序列化的开销。

内容的提问来源于stack exchange,提问作者Minathe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:57:04