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. java入门了解01

    http://www.oracle.com/technetwork/java/javase/downloads/index.html dos命令大全:http://www.zou114.com/dos ...

  2. Codeforces Round #414 C. Naming Company

    http://codeforces.com/contest/794/problem/C 题意: 有两个人要为公司起名字,每个人手中都有n个字符,现在要取一个n个字符长度的公司名.两人轮流取名,每次选择 ...

  3. unity3D用什么语言开发好?

    unity3D用什么语言开发好? 一.总结 一句话总结:选c# 同时U3D团队也会把支持的重心转移到C#,也就是说文档和示例以及社区支持的重心都在C#,C#的文档会是最完善的,C#的代码实例会是最详细 ...

  4. 【原创】Centos 7利用软件Raid搭建ISCSI过程

    测试机器安装了4块2T硬盘,一块320G硬盘,利用320G硬盘安装CentOS 7系统,在CentOS 7系统上利用4块2T硬盘组建Raid 0,再配置iSCSI存储.注意,本文中的RAID指的是软R ...

  5. 设计模式--适配器模式C++实现

    适配器模式C++实现 1定义Adapter 将一个类的接口变成客户端所需要的另外一种借口,从而使远不因为接口不匹配而无法合作的两个雷能够一起工作 又叫变压器模式,包装模式Wrapper 2类图 角色分 ...

  6. day23 CMDB 深入讲解

    课前准备: https://www.getpostman.com/postman 内容: 1. cmdb资产自动更新2. api安全认证3. restfulAPI 4. 自定义用户认证 课堂笔记: 前 ...

  7. python 细节回顾

    #!/usr/bin/python # -*- coding: UTF-8 -*- for letter in 'Python': # 第一个实例 if letter == 'h': continue ...

  8. Quartz教程:快速入门

    原文链接 | 译文链接 | 翻译:nkcoder | 校对:方腾飞 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处 ...

  9. [C#]ref,out关键字的作用

    ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点. 使用ref前必须对变量赋值,out不用 out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都 ...

  10. C# 设计模式巩固 - 工厂方法模式

    前言 实在编不出来了~ 介绍 - 工厂方法模式 官方定义:(下面摘自百度百科)工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中 ...