【问题标题】:Number of entries and duplicated key leveldb for CC 的条目数和重复键 leveldb
【发布时间】:2013-07-04 05:56:14
【问题描述】:

什么是不覆盖键的好策略?

假设我用同一个键执行了两次 Put 操作,目前它不会引发错误但会覆盖旧值。

我想保持我原来的价值。

一种选择是对每个 Put 进行额外读取,以查看它是覆盖还是插入。但是在这种情况下,对于第一个元素,我还需要检查数据库的大小。 我的 str 是一个增量字符串,因此相同代码的下一次迭代将具有相同的键但不同的 str。

leveldb_t *db;
leveldb_options_t *options;
leveldb_readoptions_t *roptions;
leveldb_writeoptions_t *woptions;
size_t read_len;
char *err = NULL;

/* OPEN */

options = leveldb_options_create();
db = leveldb_open(options, "testdb", &err);

if (err != NULL)
    return;
leveldb_free(err);
err = NULL;

/* WRITE */

woptions = leveldb_writeoptions_create();
leveldb_writeoptions_set_sync(woptions, 1);
leveldb_put(db, woptions, "Key", 3,  *str, 64 , &err);

if (err != NULL)        
    return(1);

leveldb_free(err);
err = NULL;

【问题讨论】:

  • 你能发布一些代码来展示你如何使用leveldb

标签: c leveldb


【解决方案1】:

有几个选项:

  • 在您的密钥中包含其他信息 - 可能是密钥生成时间的时间戳,或使其真正成为密钥的内容(唯一值),以便您可以找到其他类似的密钥。

  • 将与键关联的值存储为列表,然后在执行 Put 时,只需附加到此列表的末尾即可。

Leveldb 非常强大但非常简单。您只是存储字节数组,因此如何解决问题完全取决于您。想想什么是合乎逻辑的,然后弄清楚如何将其放入代码中。

【讨论】:

  • 虽然我的密钥是唯一的 id,但我仍然需要进行额外检查,数据库中没有该密钥。
  • 你能发布一些代码吗?这将有助于让其他人做出贡献,并且可以帮助我了解正在发生的事情。
【解决方案2】:

您可以在密钥上附加一个毫秒时间戳和一个 64 位随机数吗?几乎肯定是独一无二的。

【讨论】:

    【解决方案3】:

    在密钥前面加上 type。例如,如果您的密钥是“Monkey”,则将其密钥准备为“Animal:Monkey”。 LevelDB 假设给它的键是唯一的,如果键存在,则用最新的值覆盖

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-17
      • 2014-12-30
      • 2013-05-08
      • 2021-09-17
      • 2023-04-03
      • 2012-04-05
      • 2011-11-11
      • 2012-07-23
      相关资源
      最近更新 更多