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千万条。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

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