我开始使用RethinkDB,我之前从未使用过它。我在Gorethink之后与tutorial一起尝试。
总结本教程,有两个程序:
第一个无限更新条目。
for {
var scoreentry ScoreEntry
pl := rand.Intn(1000)
sc := rand.Intn(6) - 2
res, err := r.Table("scores").Get(strconv.Itoa(pl)).Run(session)
if err != nil {
log.Fatal(err)
}
err = res.One(&scoreentry)
scoreentry.Score = scoreentry.Score + sc
_, err = r.Table("scores").Update(scoreentry).RunWrite(session)
}
第二个,接收此更改并记录它们。
res, err := r.Table("scores").Changes().Run(session)
var value interface{}
if err != nil {
log.Fatalln(err)
}
for res.Next(&value) {
fmt.Println(value)
}
在RethinkDB显示的统计数据中,我可以看到每秒有1.5K的读写操作。但是在第二个程序的控制台中,我看到每秒大约有1或2个更改。
为什么会这样?我错过了什么吗?
答案 0 :(得分:4)
此代码:
r.Table("scores").Update(scoreentry).RunWrite(session)
可能不会按照您的想法行事。这会尝试通过将scoreentry
合并到表中来更新表中的每个文档。这就是RethinkDB控制台每秒显示如此多的写入数量的原因:每次运行该查询时,都会产生数千次写入。
通常你想要更新ReQL中的文档,如下所示:
r.Table('scores').Get(strconv.Itoa(pl)).Update(func (row Term) interface{} {
return map[string]interface{}{"Score": row.GetField('Score').Add(sc)};
})
如果你需要在Go代码中进行更新,你可以像这样替换那个文档:
r.Table('scores').Get(strconv.Itoa(pl)).Replace(scoreentry)
答案 1 :(得分:0)
我不确定为什么这么慢,可能是因为默认情况下每个查询都会阻塞,直到写完全刷新为止。我首先会添加一些仪器来查看哪个操作速度太慢。还有几种方法可以改善性能:
使用Durability
UpdateOpts
_, err = r.Table("scores").Update(scoreentry, r.UpdateOpts{
Durability: "soft",
}).RunWrite(session)
在goroutine中执行每个查询以允许您的代码并行执行多个查询(您可能需要使用goroutines池,但此代码只是一个简化示例)
for {
go func() {
var scoreentry ScoreEntry
pl := rand.Intn(1000)
sc := rand.Intn(6) - 2
res, err := r.Table("scores").Get(strconv.Itoa(pl)).Run(session)
if err != nil {
log.Fatal(err)
}
err = res.One(&scoreentry)
scoreentry.Score = scoreentry.Score + sc
_, err = r.Table("scores").Update(scoreentry).RunWrite(session)
}()
}