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()

异步模式使用如下

retA := connA.AsyncDo()
retB := 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千万条。

sync or async connect redis in golang的更多相关文章

  1. ASP.NET sync over async(异步中同步,什么鬼?)

    async/await 是我们在 ASP.NET 应用程序中,写异步代码最常用的两个关键字,使用它俩,我们不需要考虑太多背后的东西,比如异步的原理等等,如果你的 ASP.NET 应用程序是异步到底的, ...

  2. [Node.js] process.nextTick for converting sync to async

    For example we have a function to check the filesize: const fs = require('fs'); function fileSize (f ...

  3. Kafka之sync、async以及oneway

    kafka有同步(sync).异步(async)以及oneway这三种发送方式,某些概念上区分也可以分为同步和异步两种,同步和异步的发送方式通过“producer.type”参数指定,而oneway由 ...

  4. 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式

    1. 概念理解        在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:   同步/异步主要针对C端: 同步:    ...

  5. JavaScript sync and async(同步和异步)

    推荐四篇文章: JavaScript 是单线程的深入分析 JavaScript 运行机制详解:再谈 Event Loop JavaScript 异步编程的4种方法 JavaScript 既是单线程又是 ...

  6. Redis 在Golang中使用遇到的坑

    1.从lua脚本传回到go那边的数字是string类型 2.hincrby 返回当前值的计算结果(即存放到redis中的值) 3.hset 一个不存在的key,返回什么呢?即设置失败返回什么错误?(会 ...

  7. Tomcat redis session manager connect redis show: ERR Client sent AUTH, but no password is set

    解决问题redis问题:ERR Client sent AUTH, but no password is set - 东篱煮酒 - 博客园https://www.cnblogs.com/niepeis ...

  8. 同步sync 异步async

    线程中 同步任务是串行队列,也就是按顺序执行. 同步任务:不会开辟新的线程,它是在当前线程执行的. dispatch 调度   GCD里面的函数都是以dispatch开头的. 同步任务  步骤: 1. ...

  9. go语言之行--golang操作redis、mysql大全

    一.redis 简介 redis(REmote DIctionary Server)是一个由Salvatore Sanfilippo写key-value存储系统,它由C语言编写.遵守BSD协议.支持网 ...

随机推荐

  1. windchill10.0&11.0API_chm版百度云

    windchill10.0版本和11.0版本的javadoc,也就是api 文件内容 windchill10.0.chm版本的 windchill10.0api.chm版本 百度云链接(免费推荐) 链 ...

  2. cocos2d-x入门三 分层设计框架

    helloworld就是一个完整的框架,大致分为四个层次如下: 导演-------场景------图层-----精灵 Director-----Scene----Layer----Sprite 导演类 ...

  3. css中pt、px、em、ex、in等这类长度单位详细说明

    在CSS样式表中,我们经常会看到pt, px,em,ex,in等这类长度单位.它们各是什么意思,有什么区别呢? 在CSS样式表中,长度单位分两种: 相对长度单位,如px, em等 绝对长度单位,如pt ...

  4. kibana 安装

    一 介绍 kibana 主要实现对日志的可视化显示. 二 安装 下载安装包: wget https://download.elastic.co/kibana/kibana/kibana-4.1.2-l ...

  5. 微信小程序UI------实现携程首页顶部的界面(弹性布局)

    今天写了一个携程界面的UI,利用H5的弹性盒子来实现,学过H5弹性盒子的,来看是比较方便的,因为CSS代码都差不多. 可以看看这篇博客 快速使用CSS 弹性盒子 效果图如下: 主要是携程首页的四个模块 ...

  6. flask学习(十一):if判断语句

    1. 语法: {% if xxx %} {% else %} {% endif %} 2. if的使用,和python中if相差无几 用if判断,当用户名存在且年龄大于18时,才显示用户名和注销

  7. Codeforces Round #409

    第一题很水但是wa了一发,因为没考虑K前面是K的情况 #include<map> #include<set> #include<cmath> #include< ...

  8. 【Error】IOError: [Errno 22] invalid mode ('wb') or filename

    错误描述: IOError: [Errno 22] invalid mode ('wb') or filename: 'C:\\Users\\Viral Patel\\Documents\\GitHu ...

  9. shiro权限定义的三种方法

    1.在配置文件中定义 <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFa ...

  10. 【zzuli-2266】number(二进制处理)

    题目描述 某人刚学习了数位DP,他在某天忽然思考如下问题: 给定n,问有多少数对<x, y>满足: x, y∈[1, n], x < y x, y中出现的[0, 9]的数码种类相同 ...