如何使用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
相关产品推荐
相关产品推荐

