C的条目数和重复密钥leveldb

时间:2013-07-04 05:56:15

标签: c leveldb

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

假设我使用相同的键执行两次 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;

3 个答案:

答案 0 :(得分:1)

有几个选择:

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

使用type加密密钥。例如,如果您的密钥是“Monkey”,那么将其密钥准备为“Animal:Monkey”。 LevelDB假设给它的密钥是唯一的,只要用密钥存在就覆盖最新的值