需求:
储存同类数据,采用一个document里包含一个数组,不断的往数组里写数据,并且该数据只做记录,读取的频率非常的低。基本不会去读取。设计结构类似下面
type MsgChat struct {
ID string `bson:"id"`
Msg []string
}
数据不停的按ID区分到不同的document里,并写入Msg数组。上线之后发现写入数据并不快,显得有点缓慢。
原因:
虽然做了按ID且按天区分,但是当产生大量数据的时候,还是会出现比较多的数据,导致MSG数组比较大, 实测发现大于5000的时候就开始变慢,大于1W就更加慢,到10W的时候尽然要100多ms。 并且再写入出现错误了。错误原因是单文档不能超过16M大小。
解决方案:
1.给document里增加一个字段表示数量,每次写入的时候对该字段进行增加,然后返回最后一条数据。
当大于5000的时候,新起一个document。 这个方法预计挺不错的,但是由于有老数据,没法使用这个。
2.每次$push完毕数据之后,查询一下数据长度,假如大于5K就新开一个吧。我采用的是这个方法,实测发现速度还是可以的。
在5000条以下的时候两个操作(插入,查询)基本控制在10ms以内。
matchStage := bson.D{{"$match", bson.D{{"chatRoomID", timeChatRoomID}}}}
matchStage := bson.D{{"$match", bson.D{{"chatRoomID", timeChatRoomID}}}}
projectStage := bson.D{{"$project", bson.D{{"arrayLength", bson.M{"$size": "$msg"}}}}}
addStage := bson.D{{"$addFields", bson.D{{"arrayLength", "$arrayLength"}}}}
cursor, err2 := c.Aggregate(ctx, mongo.Pipeline{matchStage, projectStage, addStage})
aof-use-rdb-preamble yes redis 备份的时候CPU占用太高的问题。
这个都已经是默认开启了,看来只能减少redis内存占用。