1

什么是不覆盖密钥的好策略?

假设我用同一个键执行了两次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;
4

3 回答 3

1

有几个选项:

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

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

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

于 2013-07-04T06:10:40.467 回答
0

您可以在键上附加一个毫秒时间戳,然后附加一个 64 位随机数?几乎可以肯定是独一无二的。

于 2013-12-08T22:42:04.750 回答
0

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

于 2013-12-14T19:57:48.270 回答