精华内容
下载资源
问答
  • 异步机制
    2021-01-07 23:50:37

    消息发送与接收,存在同步机制与异步机制。

    同步机制

    消息发送与消息接收存在先后关系,例如先执行消息发送,发送结束后,紧接着就会堵塞当前自身的进程,不与其他应用进行任何的通信以及交互,等待接收程序的响应,待发送消息得到接收程序的返回消息之后会继续向下运行,进行下一步的业务处理。

    试用场景:请求数据查询

    1. 组织数据查询请求这帧消息
    2. 将请求消息进行发送
    3. 发送完毕后,立即进入消息接收状态,在里面循环等待,直到等到请求响应帧,将响应的数据返回。或者没有等到响应帧,可以设置一个超时时间,超过超时时间后,返回请求失败。

    异步机制

    消息发送和消息接收没有先后关系,相互独立,接收和发送可以同时进行。

    试用场景:qq聊天

    1. 消息发送和消息接收相互独立,无需等待。
    2. 可以持续发送也可以持续接收。
    3. 可以边发送边接收

    异步机制是否可以取代同步机制?

    虽然异步机制优点颇多,但是其无法取代同步机制,有些场合适用同步机制却不适用异步机制。例如:

    数据查询,需要及时获取结果,然后用此结果去执行其他操作。来看看同步机制与异步机制处理此问题的区别:

    1. 异步机制中,消息发送和接收是相互独立的,不一定在同一线程中,且需要在接收线程中才能得到查询结果,这样获取的结果需要花功夫搬运到查询的地方,很麻烦。
    2. 同步机制可以完美解决此问题,发送完查询请求后,阻塞,就地等待查询结果,拿结果就地解决问题,无需像同步机制一样将结果从接收线程中搬运过来。
    更多相关内容
  • 16 Redis 的异步机制

    万次阅读 2021-12-07 19:32:34
    16 Redis 的异步机制前言一、Redis 的阻塞点4 类交互对象和具体的操作之间的关系:和客户端交互时的阻塞点:Redis 的第一个阻塞点:集合全量查询和聚合操作:Redis 的第二个阻塞点 :bigkey 删除操作Redis 的第三个...


    前言

    命令操作、系统配置、关键机制、硬件配置等会影响 Redis 的性能,不仅要知道具体的机制,尽可能避免性能异常的情况出现,还要提前准备好应对异常的方案。

    Redis 内部的阻塞式操作:

    • CPU 核和 NUMA 架构的影响;
    • Redis 关键系统配置;
    • Redis 内存碎片;
    • Redis 缓冲区。

    一、Redis 的阻塞点

    和 Redis 实例交互的对象,以及交互时会发生的操作:

    • 客户端:网络 IO,键值对增删改查操作,数据库操作;
    • 磁盘:生成 RDB 快照,记录 AOF 日志,AOF 日志重写;
    • 主从节点:主库生成、传输 RDB 文件,从库接收 RDB 文件、清空数据库、加载 RDB 文件;
    • 切片集群实例:向其他实例传输哈希槽信息,数据迁移。

    4 类交互对象和具体的操作之间的关系:

    在这里插入图片描述

    和客户端交互时的阻塞点:

    网络 IO 有时候会比较慢,但是 Redis 使用了 IO 多路复用机制,避免了主线程一直处在等待网络连接或请求到来的状态,所以网络 IO 不是导致 Redis 阻塞的因素。

    键值对的增删改查操作是 Redis 和客户端交互的主要部分,也是 Redis 主线程执行的主要任务。复杂度高的增删改查操作肯定会阻塞 Redis。

    判断操作复杂度高低的标准:看操作的复杂度是否为 O(N)

    Redis 的第一个阻塞点:集合全量查询和聚合操作:

    Redis 中涉及集合的操作复杂度通常为 O(N),使用时需重视起来。
    例如集合元素全量查询操作 HGETALL、SMEMBERS,以及集合的聚合统计操作,例如求交、并和差集。

    Redis 的第二个阻塞点 :bigkey 删除操作

    集合自身的删除操作同样也有潜在的阻塞风险。删除操作的本质是要释放键值对占用的内存空间。 释放内存只是第一步,为了更加高效地管理内存空间,在应用程序释放内存时,操作系统需要把释放掉的内存块插入一个空闲内存块的链表,以便后续进行管理和再分配。

    这个过程本身需要一定时间,而且会阻塞当前释放内存的应用程序,如果一下子释放了大量内存,空闲内存块链表操作时间就会增加,相应地就会造成 Redis 主线程的阻塞。

    释放大量内存的时机:在删除大量键值对数据的时候,删除包含了大量元素的集合,也称为 bigkey 删除

    不同元素数量的集合在进行删除操作时所消耗的时间:
    在这里插入图片描述

    得出三个结论:

    • 当元素数量从 10 万增加到 100 万时,4 大集合类型的删除时间的增长幅度从 5 倍上升到了近 20 倍;
    • 集合元素越大,删除所花费的时间就越长;
    • 当删除有 100 万个元素的集合时,最大的删除时间绝对值已经达到了 1.98s(Hash 类 型)。Redis 的响应时间一般在微秒级别,一个操作达到了近 2s,不可避免地会阻塞主线程。

    Redis 的第三个阻塞点:清空数据库

    既然频繁删除键值对都是潜在的阻塞点了,在 Redis 的数据库级别操作中,清空数据库(例如 FLUSHDB 和 FLUSHALL 操作)也是一个潜在的阻塞风险,因为它涉及到删除和释放所有的键值对。

    Redis 的第四个阻塞点:AOF 日志同步写

    磁盘 IO 一般都是比较费时费力的,需要重点关注。 Redis 开发者早已认识到磁盘 IO 会带来阻塞,所以把 Redis 设计为采用子进程的方式生成 RDB 快照文件、执行 AOF 日志重写操作。由子进程负责执行,慢速的磁盘 IO 就不会阻塞主线程了。

    Redis 直接记录 AOF 日志时,会根据不同的写回策略对数据做落盘保存。一个同步写磁盘的操作的耗时大约是 1~2ms,如果有大量的写操作需要记录在 AOF 日志中,并同步写回的话,会阻塞主线程。

    Redis 的第五个阻塞点:从库加载 RDB 文件

    在主从集群中,主库需要生成 RDB 文件,并传输给从库。
    主库在复制的过程中,创建和传输 RDB 文件都是由子进程来完成的,不会阻塞主线程。
    但是从库在接收了 RDB 文件后,需要使用 FLUSHDB 命令清空当前数据库,正好撞上了第三个阻塞点。

    从库在清空当前数据库后,需要把 RDB 文件加载到内存,这个过程的快慢和 RDB 文件的大小密切相关,RDB 文件越大,加载过程越慢。

    切片集群实例交互时的阻塞点

    部署 Redis 切片集群时,每个 Redis 实例上分配的哈希槽信息需要在不同实例间进行传递,当需要进行负载均衡或者有实例增删时,数据会在不同的实例间进行迁移。不过哈希槽的信息量不大,而数据迁移是渐进式执行的,这两类操作对 Redis 主线程的阻塞风险不大。

    如果使用了 Redis Cluster 方案,而且同时正好迁移的是 bigkey 的话,就会造成主线程的阻塞,因为 Redis Cluster 使用了同步迁移。

    五个阻塞点:

    • 集合全量查询和聚合操作;
    • bigkey 删除;
    • 清空数据库;
    • AOF 日志同步写;
    • 从库加载 RDB 文件。

    二、可以异步执行的阻塞点

    为了避免阻塞式操作,Redis 提供了异步线程机制:

    • Redis 会启动一些子线程,然后把一些任务交给这些子线程,让它们在后台完成,而不再由主线程来执行这些任务。可以避免阻塞主线程。

    异步执行对操作的要求:

    • 一个能被异步执行的操作并不是 Redis 主线程的关键路径上的操作(客户端把请求发送给 Redis 后,等着 Redis 返回数据结果的操作)。

    在这里插入图片描述

    主线程接收到操作 1 后,操作 1 并不用给客户端返回具体的数据,主线程可以把它交给后台子线程来完成,同时只要给客户端返回一个“OK”结果就行。
    在子线程执行操作 1 的时候,客户端又向 Redis 实例发送了操作 2,客户端是需要使用操作 2 返回的数据结果的,如果操作 2 不返回结果,那么客户端将一直处于等待状态。

    操作 1 就不算关键路径上的操作,因为它不用给客户端返回具体数据,所以可以由后台子线程异步执行。
    操作 2 需要把结果返回给客户端,它就是关键路径上的操作,所以主线程必须立即把这个操作执行完。

    • Redis 读操作是典型的关键路径操作,因为客户端发送了读操作之后,就会等待读取的数据返回,以便进行后续的数据处理。而 Redis 的第一个阻塞点“集合全量查询 和聚合操作”都涉及到了读操作,不能进行异步操作。

    • 删除操作并不需要给客户端返回具体的数据结果,不算是关键路径操作。“bigkey 删除”和“清空数据库”都是对数据做删除,并不在关键路径上。可以使用后台子线程来异步执行删除操作。

    • “AOF 日志同步写”,为了保证数据可靠性,Redis 实例需要保证 AOF 日志中的操作记录已经落盘,这个操作虽然需要实例等待,但它并不会返回具体的数据结果给实例。所以可以启动一个子线程来执行 AOF 日志的同步写。

    • “从库加载 RDB 文件”要想对客户端提供数据存取服务,就必须把 RDB 文件加载完成。这个操作也属于关键路径上的操作,必须让从库的主线程来执行。

    除了“集合全量查询和聚合操作”和“从库加载 RDB 文 件”,其他三个阻塞点涉及的操作都不在关键路径上,可以使用 Redis 的异步子线程机制来实现 bigkey 删除,清空数据库,以及 AOF 日志同步写。

    三、异步的子线程机制

    Redis 主线程启动后,会使用操作系统提供的 pthread_create 函数创建 3 个子线程,负责AOF 日志写操作、键值对删除、文件关闭的异步执行。

    主线程通过一个链表形式的任务队列和子线程进行交互。

    当收到键值对删除和清空数据库的操作时,主线程会把这个操作封装成一个任务,放入到任务队列中,然后给客户端返回一个完成信息,表明删除已经完成。

    但实际上,这个时候删除还没有执行,等到后台子线程从任务队列中读取任务后,才开始实际删除键值对,并释放相应的内存空间。这种异步删除也称为惰性删除 (lazy free)。

    当 AOF 日志配置成 everysec 选项后,主线程会把 AOF 写日志操作封装成一个任务,也放到任务队列中。后台子线程读取任务后,开始自行写入 AOF 日志,主线程就不用一直等待 AOF 日志写完了。

    Redis 中的异步子线程执行机制:

    在这里插入图片描述

    异步的键值对删除和数据库清空操作是 Redis 4.0 后提供的功能,Redis 也提供了新的命令来执行这两个操作:

    • 键值对删除:集合类型中有大量元素(例如有百万级别或千万级别元素)需要删除时,建议使用 UNLINK 命令;
    • 清空数据库:可以在 FLUSHDB 和 FLUSHALL 命令后加上 ASYNC 选项,让后台子线程异步地清空数据库。
    FLUSHDB ASYNC 
    FLUSHALL AYSNC 
    

    总结

    Redis 实例运行时的 4 大类交互对象:客户端、磁盘、主从库实例、 切片集群实例

    基于这 4 大类交互对象导致 Redis 性能受损的 5 大阻塞点:集合全量查询和聚合操作、bigkey 删除、清空数据库、AOF 日志同步写、从库加载 RDB 文件

    bigkey 删除、清空数据库、AOF 日志同步写不属于关键路径操作, 可以使用异步子线程机制来完成。

    Redis 在运行时会创建三个子线程,主线程会通过一个任务队列和三个子线程进行交互。子线程会根据任务的具体类型,来执行相应的异步操作。

    异步删除操作是 Redis 4.0 以后才有的功能,如果使用的是 4.0 之前的版本,遇到 bigkey 删除时,建议:先使用集合类型提供的 SCAN 命令读取数据, 然后再进行删除。因为用 SCAN 命令可以每次只读取一部分数据并进行删除,这样可以避免一次性删除大量 key 给主线程带来的阻塞。
    例如,对于 Hash 类型的 bigkey 删除,使用 HSCAN 命令,每次从 Hash 集合中获取一部分键值对(例如 200 个),再使用 HDEL 删除这些键值对,可以把删除压力分摊到多次操作中,每次删除操作的耗时就不会太长,也就不会阻塞主线程了。

    集合全量查询和聚合操作、从库加载 RDB 文件是在关键路径上,无法使用异步操作来完成。
    建议:

    • 集合全量查询和聚合操作:使用 SCAN 命令,分批读取数据,再在客户端进行聚合计算;
    • 从库加载 RDB 文件:把主库的数据量大小控制在 2~4GB 左右,以保证 RDB 文件能以较快的速度加载。
    展开全文
  • 主要介绍了深入理解JavaScript编程中的同步与异步机制,不仅仅是AJAX已经深入到了各个角落,Node.js的火爆也让JS的异步编程格外引人注目,需要的朋友可以参考下
  • 主要介绍了java 三种调用机制(同步、回调、异步),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要为大家详细介绍了Android异步消息机制的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 视频缩略图 和显示的缓存异步机制

    热门讨论 2015-07-21 14:17:01
    视频缩略图 和显示的缓存异步机制,很实用,代码清晰,写了不少注释;关于代码的博客传送门:http://www.cnblogs.com/taofudemo/p/4664330.html
  • 同步机制与异步机制的理解 同步机制即在进行输入输出时,必须等待输入输出完毕后,才能进行后面的操作。 异步传输机制就不必等待完毕就可进行其它操作。 网络上有一个比较通俗的例子:请吃饭 同步就是我叫你...

    同步机制与异步机制的理解

    同步机制即在进行输入输出时,必须等待输入输出完毕后,才能进行后面的操作。

    异步传输机制就不必等待完毕就可进行其它操作。

     

    网络上有一个比较通俗的例子:请吃饭

    同步就是我叫你吃饭,你听到了就立刻跟我去,若你没有反应,那我就不停的叫你,直到你回应。(同步的特点是我不能做其他任何的事情,专心等你...个人觉得女生肯定希望遇到此类的男生吧...)

    异步就是我叫了你,然后我就去吃饭了,不管你听没听见。(异步的特点是不会等待正在执行的事件结束,他就可以执行其它的事件)。

     

      看了别人的帖子后,感觉自己也从中收获到很多东西.很多东西都是自己个人的看法,若有朋友有好的看法,欢迎讨论。

    转载于:https://www.cnblogs.com/Dandelion0301/p/4559722.html

    展开全文
  • 本篇文章主要介绍了浅谈Node异步编程的机制,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 视频缩略图 和显示的缓存异步机制.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • Linux异步机制

    千次阅读 2016-05-10 18:24:09
    比较准确的说法其实应该叫做“信号驱动的异步I/O”,信号是在软件层次上对中断机制的一种模拟。阻塞I/O意味着一直等待设备可访问再访问,非阻塞I/O意味着使用poll()来查询是否可访问,而异步通知则意味着设备通知...
  • JavaScript 异步机制

    千次阅读 2017-03-07 10:05:31
    之所以出现上面的结果,就是由于 setTimeout异步执行的结果,js具体的异步机制如下图所示: 异步执行是 javascript 最重要的一个特性,它的原理: js执行引擎只有一个主线程执行代码逻辑,遇到需要异步执行的...
  • 本文涉及Java编程中异步处理机制的简单介绍和一个相关实例,相信通过这篇文章,大家能对异步处理有更多的了解。
  • tornado异步机制浅析

    千次阅读 2016-11-12 00:51:37
    tornado异步非阻塞实现机制上用到了一个核心的语法:生成器——generator。在之前文章 python之yield(一) 中已经详细介绍了yield用法。coroutine的另一个作用就是启动生成器,调用next不断迭代,在此实现一个简单...
  • 线程同步和异步区别 异步机制

    万次阅读 2013-07-23 09:26:17
    1 区别同步和异步 举个简单的例子 就是游戏 游戏会有图像和背景音乐 图像是由玩家操作的 而背景音乐一般都是循环播放玩家不能操作 这里的图像和声音就分别是不同的线程 图像一般是主线程 背景音乐是守护线程(守护...
  • Axios异步机制

    千次阅读 2020-04-08 15:31:15
    Axios异步机制 需要在方法前面加上async,在请求前加上await,这样执行的请求就是同步的机制
  • JS异步执行机制的理解

    千次阅读 2018-06-13 19:33:02
    说起JS的异步执行机制,如果百度一下,你首先会发现阮一峰的写过一篇关于异步机制的文章(http://www.ruanyifeng.com/blog/2014/10/event-loop.html),等你津津有味又一头雾水的看完,然后继续看百度的其他结果,...
  • java 异步机制与同步机制的区别

    千次阅读 2016-05-06 23:39:51
    原文:http://blog.itpub.net/17074730/viewspace-563262所谓异步输入输出机制,是指在进行输入输出处理时,不必等到输入输出处理完毕才返回。所以异步的同义语是非阻塞(None Blocking)。网上有很多网友用很通俗的...
  • ES5异步机制

    千次阅读 2018-08-31 20:10:00
    一、认识异步处理—— 从定时器开始 <script> setTimeout(function(){ console.log("异步"); },3000); console.log("主线程"); </script> 二、基本介绍 1...
  • JavaScript异步机制详解

    千次阅读 2018-01-26 15:19:16
    学习JavaScript的时候了解到JavaScript是单线程的,刚开始很疑惑,单线程怎么处理网络请求、文件读写等耗时...在介绍JavaScript的异步机制之前,首先介绍一下:什么是同步?什么是异步? 同步 如果在函数返回的时
  • c#.net异步机制

    2009-04-03 11:49:56
    net异步机制 下载吧 我们一起 学习 一起进步
  • ”> 《el-button type="primary" @click="submitForm('ruleForm');test()">登录》 ...各位大佬,能用js异步执行的原理解释下面代码执行顺序吗?其中window.location.hrefsh是异步的吗?感激不尽!!!!
  • C#socket同步异步机制

    2012-07-24 11:03:37
    本文详细的总结了 C#.net同步异步SOCKET通讯和多线程,并以问答的形式解释了socket异步的实现机制
  • 使用.Net 的委托机制来为我们的程序提供异步操作行为. 1步, 为我们的AsyncTest(Hello方法) 声明一个委托 public delegate string AsyncEventHandler(string name); 2步,使用委托提供的BeginInvoke, EndInvoke 方法...
  • 事件队列会将处理事件的优先级进行排序,再通过执行栈来执行事件,由于异步会进入到异步队列中,并且异步队列需要一个等待时间才会进入到事件队列,所以通常来讲,同时处理异步和同步的时候,异步会比同步慢一些。...
  • Node.js异步机制和基本原理

    千次阅读 2017-02-19 21:39:23
    一、Node.js优缺点 node.js是单线程。 好处就是 1)简单 2)高性能,避免了频繁的线程切换开销 ...3)占用资源小,因为是单线程,在大负荷情况下,对内存占用仍然很低 ...node使用异步IO和事件驱动(回

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 450,290
精华内容 180,116
关键字:

异步机制

友情链接: DVSH85.rar