美文网首页
(Redis篇-2)- Redis的线程模型

(Redis篇-2)- Redis的线程模型

作者: Burlong | 来源:发表于2021-09-09 10:10 被阅读0次

    redis的线程模型是基于reactor的单线程模型


    [图片上传失败...(image-953d91-1631153427203)]

    为什么说redis是单线程的?


    Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费(网络IO和键值对读写)是单线程的,所以Redis才叫单线程模型。而实际上,整个redis服务并非只有一个线程在跑,除了处理网络事件外,redis还有一些其他的线程在后台处理诸如删除key、持久化等事件。

    为什么要采取单线程模型?redis官方表示


    Redis是基于内存操作,CPU不是Redis的性能瓶颈,Redis的性能瓶颈是机器的内存和网络带宽

    事件类型:

    1、文件事件:

    对多个客户端的连接实现多路复用,接收并返还执行结果。组成结构包括多个套接字、IO多路复用程序、文件事件分派器、事件处理器

    文件事件又分为读、写事件。

    • 读事件:客户端连接到服务器后就会为其绑定一个读事件,读事件有两种状态:等待、就绪。
    • 写事件:命令结果传回客户端时,服务端会为客户端关联一个写事件,写事件有两种状态:等待、就绪

    2、时间事件:

    实现服务器一些常规的定时任务。(比如定时rdb)

    时间事件又分为单次事件、循环事件

    • 单次事件:该事件会在指定的时间被处理一次,之后该事件就会被删除,不再执行。
    • 循环事件:该事件会在指定的时间被处理,之后它会按照事件处理函数的返回值,更新事件的 when 属性,让这个事件在之后的某个时间点再次运行,并以这种方式一直更新并运行下去。服务器常规操作 serverCron 就是循环事件

    redis6.0主要做了啥?


    Redis 6.0采用多个IO线程来处理网络请求,网络请求的解析可以由其他线程完成,然后把解析后的请求交由主线程进行实际的内存读写。提升网络请求处理的并行度,进而提升整体性能。 但是,Redis 的多 IO 线程只是用来处理网络请求的,对于读写命令,Redis 仍然使用单线程来处理。

    实现机制如下

    • 主线程负责接收建立连接请求,获取 Socket 放入全局等待读处理队列。
    • 主线程处理完读事件之后,通过 RR(Round Robin)将这些连接分配给这些 IO 线程。
    • 主线程阻塞等待 IO 线程读取 Socket 完毕。
    • 主线程通过单线程的方式执行请求命令,请求数据读取并解析完成,但并不执行。
    • 主线程阻塞等待 IO 线程将数据回写 Socket 完毕。
    • 解除绑定,清空等待队列。

    [图片上传失败...(image-658647-1631153427202)]

    参考文献:

    https://segmentfault.com/a/1190000037434936

    https://blog.csdn.net/a745233700/article/details/113488673

    https://zhuanlan.zhihu.com/p/344007443

    https://redisbook.readthedocs.io/en/latest/internal/ae.html

    相关文章

      网友评论

          本文标题:(Redis篇-2)- Redis的线程模型

          本文链接:https://www.haomeiwen.com/subject/aydiwltx.html