根据Leveldb的官方文件:
默认情况下,每次写入leveldb都是异步的:它在将进程写入操作系统后返回。从操作系统内存到底层持久存储的转移是异步发生的。
所以我想知道写后读写危险是否会发生:
db->Put(leveldb::WriteOptions(), "key", "value1");
db->Put(leveldb::WriteOptions(), "key", "value2");
//异步db->Get(leveldb::ReadOptions(), "key", &result);
// result == "value1"
而不是"value2"
是否可能?我写了一个程序来测试它:
#include <iostream>
#include <leveldb/db.h>
#include <sstream>
#include <cstdlib>
#include <cassert>
using namespace std;
leveldb::DB* db;
leveldb::Options options;
int main()
{
options.create_if_missing = true;
leveldb::DB::Open(options, "test.db", &db);
for(int i=0; i<10000000; ++i)
{
stringstream ss;
ss << i;
string sbefore = ss.str();
db->Put(leveldb::WriteOptions(), "x", sbefore);
if (!(std::rand() % 4))
{
string safter;
db->Get(leveldb::ReadOptions(), "x", &safter);
assert(sbefore == safter);
}
}
delete db;
}
在这种情况下,似乎断言总是正确的,但我不确定它是否是一般规则。
答案 0 :(得分:0)
所以我想知道写后读写危险是否会发生:
[坏事]
不,你不必担心。 Put()s记录在内存中,并在每个Get()上检查;读取不是直接来自磁盘。看到DBImpl :: Get()的这一部分: https://github.com/google/leveldb/blob/dac40d25f6ce69c8b6685ab09f240cb63cfd5ab3/db/db_impl.cc#L1135