RocksDb:每个键多个值 (c++)

问题描述 投票:0回答:3

RocksDb:每个键多个值 (c++)

我想做什么

我正在尝试调整我的简单区块链实现,以定期将区块链保存到硬盘驱动器,因此我查看了不同的数据库解决方案的信息。我决定使用 RocksDb 因为它的易用性和良好的文档和示例。我通读了文档,但无法弄清楚如何使其适应我的用例。 我有课 `

class Block {
public:
    string PrevHash;
    
private:
    blockheader header; // The header of the block 
    uint32_t index; // height of this block
    std::vector<tx_data> transactions; // All transactions in the block in a vector
    std::string hash; // The hash of the block
    uint64_t timestamp; // The timestamp this block was created by the node 
    std::string data; // Extra data that can be appended to blocks (for example text or a smart contract)
                      // - The larger this feild the higher the fee and the max size is defined in config.h
};

其中包含一些变量和一个 struct tx_data 的向量。我想将这些数据加载到rocksdb数据库中。

我已经尝试过了

在谷歌未能返回使用一个密钥对存储多个值的任何结果之后,我决定必须将每个块数据放在开头的 0xa1 中,然后放在结尾的 0x2a 中

*0x2a*
header
index
txns
hash
timestamp
data
*0x2a*

但我决定肯定有一种更简单的方法。我尝试查看turtlecoin使用的代码,这是一种使用rocksdb作为数据库的货币,但那里的代码几乎无法辨认,我听说过序列化,但似乎没有什么信息。

也许我误解了数据库的使用?

c++ blockchain rocksdb
3个回答
2
投票

您需要将其序列化。序列化是获取一组结构化数据并将其转换为一个字符串、数字或字节向量的过程,然后可以将其反序列化回该结构。一种方法是获取块的哈希值并将其用作数据库中的键,然后创建一个不包含哈希值的新结构。然后编写一个函数,该函数采用 Block 结构和路径并构造 BlockNoHash 结构并保存它。然后另一个函数从哈希中读取块并吐出块结构。基本上,您可以使用数据中永远不会出现的字符来分割每个字段(例如 ` 或 |),但这意味着如果其中一个数据已损坏,那么您将无法获取任何其他数据


1
投票

这里有两个相关问题。

其中一个是:如何在 RocksDB 这样的键值存储中存储复杂的数据(不仅仅是简单的整数或字符串)。正如 Leo 所说,你需要将它们序列化。

而不是编写自己的代码,典型的更简单的方法是使用像 Protobuf 或 Thrift 这样的框架来生成代码,在内存结构和适合存储在数据库中的平面字节表示之间进行转换(或通过网络。)

标题中的一个相关问题:如何为每个键存储多个值?

有两个主要选项:

  • 使用复合键来区分不同的值。通过遍历键前缀,您可以找到一组相关键中的所有值。如果值变得非常大或者您想独立查找和更新它们,那么这会更好。

  • 或者,使单个键的值实际上是一个包含多个内部值的复合对象。如果您总是想在单个操作中获取所有子值,这是最简单的。


0
投票

如果你想单独获取每个值,那么你也需要使用rockdb Column Families

© www.soinside.com 2019 - 2024. All rights reserved.