我已经在我的项目中实现了 levigo 包装器,所以我可以使用 LevelDB。该声明相当样板,如下所示:
func NewLeveldbStorage(dbPath string) *leveldbStorage {
opts := levigo.NewOptions()
opts.SetCache(levigo.NewLRUCache(3<<30))
opts.SetCreateIfMissing(true)
log.Debugf("Entering Open")
db, err := levigo.Open(dbPath, opts); if err != nil {
log.Fatal("BOOM %v", err)
}
log.Debugf("Finished calling open")
opts.Close()
return &leveldbStorage{db:db}
}
这是返回的结构:
type leveldbStorage struct {
db *levigo.DB
}
然后我在结构上做了一些简单的 GET 和 STORE 命令,它们基本上只使用s.db.Get和s.db.Put。这在我的测试中运行良好,但是当我运行以下基准测试时:
func BenchmarkLeviDbGet(b *testing.B) {
s := storage.NewLeveldbStorage("/path/to/db")
value := "value"
uid,_ := s.Store(value)
b.ResetTimer()
for i := 0; i < b.N; i++ {
s.Get(uid)
}
该基准测试在运行时返回:
2014/10/12 21:17:09 BOOM %vIO error: lock /path/to/db/LOCK: already held by process
有没有合适的方法使用 levigo/leveldb 来启用多线程阅读?写作呢?如果不可能进行多线程写入,我不会感到惊讶,但多线程读取似乎应该如此。我在这里做错了什么?
一只甜甜圈
相关分类