iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >为什么说redis是单线程的
  • 402
分享到

为什么说redis是单线程的

2024-04-02 19:04:59 402人浏览 薄情痞子
摘要

这篇文章主要介绍为什么说Redis是单线程的,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Redis即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久

这篇文章主要介绍为什么说Redis是单线程的,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

Redis即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的api

文件事件处理器

Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、io多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。

为什么说redis是单线程的

消息处理流程

文件事件处理器使用I/O多路复用(multiplexing)程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。

当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。

尽管多个文件事件可能会并发地出现,但I/O多路复用程序总是会将所有产生事件的套接字都推到一个队列里面,然后通过这个队列,以有序(sequentially)、同步(synchronously)、每次一个套接字的方式向文件事件分派器传送套接字:当上一个套接字产生的事件被处理完毕之后(该套接字为事件所关联的事件处理器执行完毕), I/O多路复用程序才会继续向文件事件分派器传送下一个套接字。

I/O 多路复用程序的实现

Redis的I/O多路复用程序的所有功能是通过包装select、epoll、evport和kqueue这些I/O多路复用函数库来实现的,每个I/O多路复用函数库在Redis源码中都对应一个单独的文件,比如ae_select.c、ae_epoll.c、ae_kqueue.c等。

因为Redis为每个I/O多路复用函数库都实现了相同的API,所以I/O多路复用程序的底层实现是可以互换的,如下图所示。

为什么说redis是单线程的

有关epoll的详细讲解,可以点击查看,彻底搞懂epoll高效运行的原理

Redis在I/O多路复用程序的实现源码中用#include宏定义了相应的规则,程序会在编译时自动选择系统中性能最好的I/O多路复用函数库来作为Redis的I/O多路复用程序的底层实现:


#ifdef HAVE_EVPORT
#include "ae_evport.c"
#else
    #ifdef HAVE_EPOLL
    #include "ae_epoll.c"
    #else
        #ifdef HAVE_KQUEUE
        #include "ae_kqueue.c"
        #else
        #include "ae_select.c"
        #endif
    #endif
#endif

文件事件的类型

I/O 多路复用程序可以监听多个套接字的ae.h/AE_READABLE事件和ae.h/AE_WRITABLE事件,这两类事件和套接字操作之间的对应关系如下:

当套接字变得可读时(客户端对套接字执行write操作,或者执行close操作),或者有新的可应答(acceptable)套接字出现时(客户端对服务器的监听套接字执行connect操作),套接字产生AE_READABLE 事件。

当套接字变得可写时(客户端对套接字执行read操作),套接字产生AE_WRITABLE事件。I/O多路复用程序允许服务器同时监听套接字的AE_READABLE事件和AE_WRITABLE事件,如果一个套接字同时产生了这两种事件,那么文件事件分派器会优先处理AE_READABLE事件,等到AE_READABLE事件处理完之后,才处理AE_WRITABLE 事件。这也就是说,如果一个套接字又可读又可写的话,那么服务器将先读套接字,后写套接字。

文件事件的处理器

Redis为文件事件编写了多个处理器,这些事件处理器分别用于实现不同的网络通讯需求,常用的处理器如下:

为了对连接服务器的各个客户端进行应答, 服务器要为监听套接字关联连接应答处理器。

为了接收客户端传来的命令请求, 服务器要为客户端套接字关联命令请求处理器。

为了向客户端返回命令的执行结果, 服务器要为客户端套接字关联命令回复处理器。

连接应答处理器

networking.c中accepttcpHandler函数是Redis的连接应答处理器,这个处理器用于对连接服务器监听套接字的客户端进行应答,具体实现为sys/Socket.h/accept函数的包装。

当Redis服务器进行初始化的时候,程序会将这个连接应答处理器和服务器监听套接字的AE_READABLE事件关联起来,当有客户端用sys/socket.h/connect函数连接服务器监听套接字的时候, 套接字就会产生AE_READABLE 事件, 引发连接应答处理器执行, 并执行相应的套接字应答操作,如图所示。

为什么说redis是单线程的

命令请求处理器

networking.c中readQueryFromClient函数是Redis的命令请求处理器,这个处理器负责从套接字中读入客户端发送的命令请求内容, 具体实现为unistd.h/read函数的包装。

当一个客户端通过连接应答处理器成功连接到服务器之后, 服务器会将客户端套接字的AE_READABLE事件和命令请求处理器关联起来,当客户端向服务器发送命令请求的时候,套接字就会产生 AE_READABLE事件,引发命令请求处理器执行,并执行相应的套接字读入操作,如图所示。

为什么说redis是单线程的

在客户端连接服务器的整个过程中,服务器都会一直为客户端套接字的AE_READABLE事件关联命令请求处理器。

命令回复处理器

networking.c中sendReplyToClient函数是Redis的命令回复处理器,这个处理器负责将服务器执行命令后得到的命令回复通过套接字返回给客户端,具体实现为unistd.h/write函数的包装。

当服务器有命令回复需要传送给客户端的时候,服务器会将客户端套接字的AE_WRITABLE事件和命令回复处理器关联起来,当客户端准备好接收服务器传回的命令回复时,就会产生AE_WRITABLE事件,引发命令回复处理器执行,并执行相应的套接字写入操作, 如图所示。

为什么说redis是单线程的

当命令回复发送完毕之后, 服务器就会解除命令回复处理器与客户端套接字的 AE_WRITABLE 事件之间的关联。

一次完整的客户端与服务器连接事件示例

假设Redis服务器正在运作,那么这个服务器的监听套接字的AE_READABLE事件应该正处于监听状态之下,而该事件所对应的处理器为连接应答处理器。

如果这时有一个Redis客户端向Redis服务器发起连接,那么监听套接字将产生AE_READABLE事件, 触发连接应答处理器执行:处理器会对客户端的连接请求进行应答, 然后创建客户端套接字,以及客户端状态,并将客户端套接字的 AE_READABLE 事件与命令请求处理器进行关联,使得客户端可以向主服务器发送命令请求。

之后,客户端向Redis服务器发送一个命令请求,那么客户端套接字将产生 AE_READABLE事件,引发命令请求处理器执行,处理器读取客户端的命令内容, 然后传给相关程序去执行。

执行命令将产生相应的命令回复,为了将这些命令回复传送回客户端,服务器会将客户端套接字的AE_WRITABLE事件与命令回复处理器进行关联:当客户端尝试读取命令回复的时候,客户端套接字将产生AE_WRITABLE事件, 触发命令回复处理器执行, 当命令回复处理器将命令回复全部写入到套接字之后, 服务器就会解除客户端套接字的AE_WRITABLE事件与命令回复处理器之间的关联。

为什么说redis是单线程的

以上是“为什么说redis是单线程的”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: 为什么说redis是单线程的

本文链接: https://www.lsjlt.com/news/54646.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 为什么说redis是单线程的
    这篇文章主要介绍为什么说redis是单线程的,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Redis即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久...
    99+
    2024-04-02
  • 为什么说单线程的Redis比较快
    这篇文章主要为大家展示了“为什么说单线程的Redis比较快”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“为什么说单线程的Redis比较快”这篇文章吧。单线程的 ...
    99+
    2024-04-02
  • Redis是单线程为什么这么快
    这篇文章给大家分享的是有关Redis是单线程为什么这么快的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一.Redis简介Redis是一个开源的内存中的数据结构存储系统,它可以用作...
    99+
    2024-04-02
  • redis为什么用单线程
    本篇内容主要讲解“redis为什么用单线程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“redis为什么用单线程”吧!1.基本概念什么是redis的单线程(核心...
    99+
    2024-04-02
  • Redis为什么选择单线程?Redis为什么这么快?
    今天搞一下经典面试题Redis为什么选择单线程?Redis为什么这么快?,实现快速入门,丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦。 一、Re...
    99+
    2023-03-21
    redis为什么选择单线程和双线程 为什么redis是单线程的 redis单线程为什么能支持并发
  • redis中单线程指的是什么
    小编给大家分享一下redis中单线程指的是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!那么为什么Redis是单线程的我们首...
    99+
    2024-04-02
  • 为什么JS是单线程的
    小编给大家分享一下为什么JS是单线程的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!为什么JS是单线程的?这主要与JS的用途有关...
    99+
    2024-04-02
  • 为什么nodejs是单线程的
    在开发Web应用或者服务器端应用时,Node.js已成为了一种非常流行的选择。Node.js是一个基于Chrome V8 JavaScript引擎的开源平台,它允许在服务器端使用JavaScript编写高性能、可扩展的应用程序。然而,相对于...
    99+
    2023-05-18
  • 浅谈为什么单线程的redis那么快
    目录redis单机QPS为什么这么快内存型数据库简单的数据结构单线程IO多路复用总结redis单机QPS ./redis-benchmark -t set,lpush -n 1...
    99+
    2024-04-02
  • redis单线程快的原因是什么
    这篇文章主要为大家展示了“redis单线程快的原因是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“redis单线程快的原因是什么”这篇文章吧。Redis之所...
    99+
    2024-04-02
  • Redis选择单线程的原因是什么
    本文小编为大家详细介绍“Redis选择单线程的原因是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Redis选择单线程的原因是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、Redis版本迭代Redi...
    99+
    2023-07-05
  • Redis使用单线程为什么还这么快
    这篇文章将为大家详细讲解有关Redis使用单线程为什么还这么快,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis为什么用单线程?多线程的开销通常情况下,在采用多线程后,如果没有良好的系统设计,其实是...
    99+
    2023-06-29
  • Redis是单线程还是多线程
    Redis是单线程的,即所有的操作都是由一个线程来处理的。这是因为Redis主要使用内存来存储数据,而内存访问速度非常快,所以单线程...
    99+
    2024-04-09
    Redis
  • 为什么说HashMap线程不安全
    目录1. 并发修改导致数据不一致2. 并发扩容导致死循环或数据丢失3. 非线程安全的迭代器4. 非线程安全的比较器在Java中,HashMap是一种常用的数据结构,它以键值对的形式存...
    99+
    2023-05-18
    HashMap线程不安全
  • redis是单线程分析
    这篇文章主要介绍redis是单线程分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!以前一直有个误区,以为:高性能服务器  一定是 多线程来实现的原因很简单因为误区二导致的...
    99+
    2024-04-02
  • 什么是Redis多线程
    这篇文章主要介绍“什么是Redis多线程”,在日常操作中,相信很多人在什么是Redis多线程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是Redis多线程”的疑惑有所帮...
    99+
    2024-04-02
  • redis属于单线程还是多线程
    小编给大家分享一下redis属于单线程还是多线程,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Redis4.0之前是单线程运行的...
    99+
    2024-04-02
  • Redis线程模型是什么
    这篇文章主要讲解了“Redis线程模型是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis线程模型是什么”吧! Redis它是一个单线程的,这一点需要去注意的。首先我们呢会有一个客...
    99+
    2023-06-30
  • Redis单线程能支撑高并发的原因是什么
    本篇内容介绍了“Redis单线程能支撑高并发的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!几种...
    99+
    2024-04-02
  • Redis不是一直号称单线程效率也很高吗,为什么又采用多线程了?
    Redis是目前广为人知的一个内存数据库,在各个场景中都有着非常丰富的应用,前段时间Redis推出了6.0的版本,在新版本中采用了多线程模型。 因为我们公司使用的内存数据库是自研的,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作