什么是不覆盖密钥的好策略?
假设我使用相同的键执行两次 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;
答案 0 :(得分:1)
有几个选择:
在您的密钥中包含其他信息 - 可能是生成密钥的时间戳,或者使密钥真正成为密钥的时间 - 一个独特的值 - 以您可以找到其他类似密钥的方式。
将与键关联的值存储为列表,然后在执行Put时,只需附加到此列表的末尾。
Leveldb非常强大但非常简单。您只是存储字节数组,因此完全取决于您如何解决问题。想一想逻辑上有意义的东西,然后弄清楚如何把它放到代码中。
答案 1 :(得分:0)
您可以在键上附加毫秒时间戳,然后是64位随机数吗?几乎肯定是独特的。
答案 2 :(得分:0)
使用type
加密密钥。例如,如果您的密钥是“Monkey”,那么将其密钥准备为“Animal:Monkey”。 LevelDB假设给它的密钥是唯一的,只要用密钥存在就覆盖最新的值