sync or async connect redis in golang

Head of head

在golang的整个生态里,redis client lib全部都使用多连接或者连接池。这是让人难以理解的,所以我和xiaofei一起写了一个同时支持同步和异步的redis client lib:RedisGo-Async。

github地址:https://github.com/gistao/RedisGo-Async

qq群:131958277。

同步模式

A -> B

A <- B

A请求,并获取结果,经历1个RTT,这里称之为同步模式。

为了实现高QPS,需要M个AB来处理任务,这样可以得到一个公式:M/RTT。

异步模式

A -> -> -> B

A <- <- <- B

A请求,不等待应答继续请求,并获取全部结果,经历1个RTT,这里称之为异步模式。

为了实现高QPS,同样可以得到一个公式:C,C表示发包频率。

复杂度

异步模式一般使用回调,较同步方式复杂的多。但GoRedis-Async提供的两种模式的使用是一样的。

conn := pool.Get()
ret, err := conn.Do()
doSomething(ret)

当你想在两种模式下切换时,这些代码都不用更改。

值得注意的是pipelining,同步模式的使用如下
conn.Send(A)
conn.Send(B)
conn.Flush()
conn.Recive() // ret <-A
conn.Recive() // ret <-B

而异步模式是天然支持pipelining的,所以使用还是
conn.Do(A)
conn.Do(B)

有时你会希望同时向Redis serverA,B,C请求,最后一次性来处理结果。同步模式的使用如下

connA.Send()
connA.Flush()

connB.Send()
connB.Flush()

connC.Send()
connC.Flush()

connA.Recive()
connB.Recive()
connC.Recive()

异步模式使用如下

connB.AsyncDo()
retC := connC.AsyncDo()

retA.Get()
retC.Get()
retB.Get()

扩展性

同步模式:M/RTT

在GoRedis-Async里,M表示
Pool.MaxActive

这个值是固定的,取决于当前测试环境:

  1. 应用程序和Redis server的网络RTT
  2. 应用程序里的并发度
  3. Redis server的连接数上限
  4. 本机的连接数上限
  5. 本机的CPU核数。

举个关于RTT的例子:

测试环境的网络RTT为1ms,应用程序经测试达到QPS要求后,M被确定到代码中,然后上线到生产环境,而生产环境的RTT为10ms,那么生产环境的QPS就会比预期要低10倍。或者在生产环境里,由于目标Redis server发生故障而被切到了备机,此时备机和应用程序极有可能会跨机房,这也会带来同样的问题。

异步模式:C

在GoRedis-Async里,C只和应用程序的routine数量有关,上边所述的RTT问题在异步模式下并不存在。

当然,在特定范围内都可以被应用程序接受的话,同步和异步模式选择哪种都是适合的。

MM(Min cost Max payload)

基础库好坏的一个重要衡量标准就是MM。

同步模式从理论上来说,相比较异步模式需要更多的线程和连接资源。下边是RedisGo-Async、redigo、官方redisclient的对比基准测试报告。Y轴是耗时ms,X轴为各对比库,测试数据为1千万条。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,711评论 19 139
  • 人生路,不是一帆风顺,不是一路坦途,有顺境,有逆境。 顺境时,朋友环绕,你同他们同乐; 逆境时,周围寂静,你一人享...
    爱生活挺自己阅读 241评论 0 0
  • 有時候丟失了一件習以為常的東西,即使不是很貴重的物品,但是我還是會感到異常的心慌。很多時候,一件東西並不能以它...
    Narcissus_0605阅读 245评论 0 0
  • 10月4日 周二 下雨 昨晚跟我姐油闹了一出,我实在是受不了了她打着对我好的虚伪旗帜入侵到我的生活中对我指手画脚,...
    天外来客人阅读 405评论 0 0

友情链接更多精彩内容