Redis 线程模型

Redis 线程模型文件事件处理器 fileeventhan Redis 基于 Reactor 模式开发了自己的网络事件处理器 这个处理器被称为文件事件处理器 fileeventhan 文件事件处理器使用 I O 多路复用 multiplexing 程序来同时监听多个套接字 并根据套接字目前执行的任务来为套接字关联不同的事件处理器 当被监听的套接字准备好执行连接应答 accept

  • 文件事件处理器(file event handler)
  1. Redis 基于 Reactor 模式开发了自己的网络事件处理器: 这个处理器被称为文件事件处理器(file event handler)
  2. 文件事件处理器使用 I/O 多路复用(multiplexing)程序来同时监听多个套接字, 并根据套接字目前执行的任务来为套接字关联不同的事件处理器。
  3. 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时, 与操作相对应的文件事件就会产生, 这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。
  4. 文件事件处理器以单线程方式运行, 但通过使用 I/O 多路复用程序来监听多个套接字, 文件事件处理器既实现了高性能的网络通信模型, 又可以很好地与 redis 服务器中其他同样以单线程方式运行的模块进行对接, 这保持了 Redis 内部单线程设计的简单性。
  • Redis线程模型

 

Redis 线程模型

Redis 线程模型

Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型。
 

  • Redis是单线程模型为什么效率还这么高?
  1. 纯内存访问:数据存放在内存中,内存的响应时间大约是100纳秒,这是Redis每秒万亿级别访问的重要基础。
  2. 非阻塞I/O:Redis采用epoll做为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了时间,不在I/O上浪费过多的时间。
  3. 单线程避免了线程切换和竞态产生的消耗。
  4. Redis采用单线程模型,每条命令执行如果占用大量时间,会造成其他线程阻塞,对于Redis这种高性能服务是致命的,所以Redis是面向高速执行的数据库

 

  • IO多路复用技术
  1. 参考:https://www.cnblogs.com/wlwl/p/10293057.html

举个例子,模拟一个tcp服务器处理30个客户socket。

假设你是一个老师,让30个学生解答一道题目,然后检查学生做的是否正确,你有下面几个选择:

  1. 第一种选择:按顺序逐个检查,先检查A,然后是B,之后是C、D。。。这中间如果有一个学生卡主,全班都会被耽误。这种模式就好比,你用循环挨个处理socket,根本不具有并发能力。
  2. 第二种选择:你创建30个分身,每个分身检查一个学生的答案是否正确。 这种类似于为每一个用户创建一个进程或者线程处理连接。
  3. 第三种选择,你站在讲台上等,谁解答完谁举手。这时C、D举手,表示他们解答问题完毕,你下去依次检查C、D的答案,然后继续回到讲台上等。此时E、A又举手,然后去处理E和A。。。 这种就是IO复用模型(Linux下的select、poll和epoll就是干这个的。将用户socket对应的fd注册进epoll,然后epoll帮你监听哪些socket上有消息到达,这样就避免了大量的无用操作。此时的socket应该采用非阻塞模式。这样,整个过程只在调用select、poll、epoll这些调用的时候才会阻塞,收发客户消息是不会阻塞的,整个进程或者线程就被充分利用起来,这就是事件驱动,所谓的reactor模式。)

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203157.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午10:27
下一篇 2026年3月19日 下午10:27


相关推荐

  • python数据库操作之sqlalchemy逆向工程

    python数据库操作之sqlalchemy逆向工程依赖安装pipinstallsqlacodegen数据库配置config.pyimportosHOST=’localhost’PORT=3306USERNAME=’root’PASSWORD=’root’DB=’demo’DB_URI=f’mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DB}’#自动生成modelsos.system(f’sqlacodegen{DB_URI}

    2022年6月22日
    39
  • Java中的List与Set转换「建议收藏」

    Java中的List与Set转换「建议收藏」一、List列表与Set列表的区别List列表是有序、可以重复、线程不安全的列表,Set是无序、不能重复、线程不安全的列表。但List和Set可以通过方法来转换为线程安全的,加互斥锁。Set<Long>set=newHashSet<>();//转换为线程安全的集合Collections.synchronizedSet(…

    2022年6月21日
    56
  • 移动端开发之APP消息推送[通俗易懂]

    移动端开发之APP消息推送[通俗易懂]有这样一种场景,当你在手机APP上输入你的信息,会自动跳出一个弹窗,表示某任务已执行。最简单的一个例子就是当你输入手机号,点击获取验证码的时候,就会跳出一个对话框,说“验证码已发送到手机,请注意查收”,这些都是如何实现的。

    2022年6月2日
    44
  • 解决pycharm需手动配置环境变量问题

    解决pycharm需手动配置环境变量问题问题 在运行程序前 需要配置一下环境变量 但是通过 terminal 发送命令并不好使 exportLD LIBRARY PATH LD LIBRARY PATH usr local cuda extras CUPTI lib64 在这个地方找一下 在 EditConfigur 中 找到这个 EnvironmentV 添加 name 和 value apply 一下就 ok 了 也不需要每次都手动输入 这里的 name 和 value 根据需要进行设置 比如提示缺少 key PROP 那么就填

    2026年3月26日
    2
  • Windows10下python pip卸载并重新安装

    Windows10下python pip卸载并重新安装pip已经升级到最新版本,但还是会提示我在使用旧版本,所以把pip卸载并重新安装一次,之后就没有再提示升级了卸载pip中间会有一个提示,输入Y即可python-mpipuninstallpip找到python所在的目录,进入到子目录Scripts中,打开cmd,输入以下命令:easy_inatall-Upip这样就会重新安装pip并升级到最新版本。再进行pipinstall时候也不会提示升级了。…

    2022年10月19日
    3
  • linux编译so库「建议收藏」

    linux编译so库「建议收藏」一、动态库so的编译以一个例子来说明。这里有三个so_test.h,test_a.c,test_b.c#ifndef_SO_TEST_H_#define_SO_TEST_H_voidtest_a();voidtest_b();voidtest_c();#endif /*_SO_TEST_H_*/#include#include”so_test.h”

    2022年6月29日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号