首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一日一学

原文作者;WuXiao_

来源:简书

本文重点介绍mgo使用,仅简单介绍mongodb。

mongodb特性

mongdb简单介绍

mgo简介

mgo 是 mongodb 的 GO 语言驱动包。

mgo官网:http://labix.org/mgo

mgo使用mgo方案一

这里的 session 能够和 mongodb 集群中的所有Server通讯。

session设置的模式分别为:

Strong

session 的读写一直向主服务器发起并使用一个唯一的连接,因此所有的读写操作完全的一致。

Monotonic

session 的读操作开始是向其他服务器发起(且通过一个唯一的连接),只要出现了一次写操作,session 的连接就会切换至主服务器。由此可见此模式下,能够分散一些读操作到其他服务器,但是读操作不一定能够获得最新的数据。

Eventual

session 的读操作会向任意的其他服务器发起,多次读操作并不一定使用相同的连接,也就是读操作不一定有序。session 的写操作总是向主服务器发起,但是可能使用不同的连接,也就是写操作也不一定有序。

通过find()可以进行单个或者全部的查询,并且可以进行分页处理。下面为简单代码展示:

mgo更新方法很多,如批量更新,更新或插入数据 。

思路一会儿

mgo方案二

思考: session 会被全局使用,当在实际的程序中,我们可以开启goroutine 来处理每个连接,多个goroutine 可以通过 session.Clone() 来创建或复用连接,使用完成之后通过 session.Close() 来关闭这个连接。当并发很高时,看起来可以提高效率。

下面部分代码修改 :

对查找进行了修改

mgo方案一和二测试:

使用boom进行并发测试,并在每个 goroutine 里面sleep 5秒,这样是让连接暂时不释放,就可以看到 mgo 方案二 会不断创建新连接,方案一不会创建新连接。可以使用mongo shell 的db.serverStatus().connections来查看连接数。

提示: mgo 默认连接池是 4096,在高并发下,如果每个 session都不调用 close(),会导致连接数会很快就达到 4096,并堵死其他请求,所以在使用clone() 或 copy()时 session 时一定要使用 defer close() 把连接关闭。启用 maxPoolLimit 参数会限制总连接大小,当连接超过限制总数当前协程 等待,直到可以创建连接。

为什么

可能性,由于数据少或者处理的单个mongo无法看出效果。

由于目前自己项目只使用了一个mongo,后期使用多个mongo进行或在大量数据下测试。如果大家有什么好的建议,提出来进行学习思考。

推荐学习:

http://goinbigdata.com/how-to-build-microservice-with-mongodb-in-golang/

官方博客详讲了mgo并发处理,如下:

https://www.mongodb.com/blog/post/running-mongodb-queries-concurrently-with-go

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

Golang语言社区

ID:Golangweb

游戏服务器架构丨分布式技术丨大数据丨游戏算法学习

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190104A1HRCT00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券