Redis事件循环

news2024/10/1 7:39:59

Redis事件循环

  • 文件事件
  • 时间事件
  • 事件调度和执行
  • 客户端部分
    • 关于客户端输出缓冲区限制
  • ServerCron周期函数
  • 服务器启动流程
  • 小结


Redis服务器是一个事件驱动程序, 主要处理两类事件:

  • 文件事件 (File Event) : 对套接字操作的抽象,服务器与客户端的通信过程会产生相应的文件实际,服务器通过监听并处理这些事件完成一些了网络通信操作。
  • 时间事件 (Time Event): 需要定时或者周期性执行的操作,主要是redis中的serverCron函数。

我们需要关注的点有以下几处:

  • redis如何处理文件事件,即: 处理客户端连接—>处理客户端命令—>回复客户端这个过程是怎样实现的
  • redis时间事件作用,即: 周期性执行的函数serverCron干了啥
  • redis如何在单线程的情况下统筹安排文件事件和时间事件的执行

文件事件

Redis基于IO多路复用模式开发了自己的网络事件处理器,这个处理器被称为文件事件处理器,该处理器核心运作流程如下:
在这里插入图片描述

  • redis服务器初始化时会通过epoll监听server socket上产生的AE_READABLE事件,其实就是客户端accept事件,并且将连接应答处理器和客户端accpet事件关联起来,当产生accpet事件时,就触发关联的应答处理器执行。
  • 当产生accpet事件时,会触发连接应答处理器执行,该处理器内部再获取到客户端的socket后,会向epoll注册监听当前socket的AE_READABLE事件,也就是监听客户端是否发命令了,并且会将客户端可读事件与命令请求处理器进行关联,该处理器负责处理客户端发送的命令。
  • 当客户端发送一条命令请求后,对应客户端socket产生读事件,引发关联的命令请求处理器执行,该处理器从客户端socket中读取出命令请求内容,然后解析执行命令。
  • 执行命令会产生对应的命令回复,为了将回复传送会客户端,服务器会将客户端socket的AE_WRITABLE可写事件与命令回复处理器进行关联,当对应的socket可写时,命令回复处理器将命令回复全部写到对应的客户端socket后,服务器就会解除对应客户端socket的AE_WRITABLE事件与命令回复处理器之间的关联。

具体细节参考本文


时间事件

一个时间事件主要由以下三个属性组成:

  • id : 递增
  • when : 时间事件到达时间
  • timeProc : 时间事件处理器,当时间事件到达时,服务器调用绑定的处理器来处理事件

redis处理时间事件的流程大致如下所示 :
在这里插入图片描述

Tips:
如果时间事件处理器返回一个非AE_NOMORE的整数值,那么表示当前事件是一个周期性事件,返回值代表多少毫秒后该事件需要继续被执行。


Redis默认只会运行很少的时间事件,最重要的一个时间事件就是serverCron函数,该函数主要负责以下工作:

  • 更新服务器各类统计信息,如时间,内存,数据库占用情况等
  • 清理数据库中的过期键值对
  • 关闭和清理连接失效的客户端
  • 尝试进行AOF或RDB持久化操作
  • 如果服务器是主服务器,那么对从服务器进行定期同步
  • 如果处于集群模式,对集群进行定期同步和连接测试

Redis服务器会以周期性事件的方式来运行serverCron函数,该函数在Redis 2.6版本中默认每秒运行10次。


事件调度和执行

Redis是如何协调文件事件和时间事件的执行的呢?

在这里插入图片描述
在这里插入图片描述
由于redis需要不断的去处理文件和时间事件,因此aeProcessEvents函数需要置于一个循环里面,加上初始化和清理函数,这就构成了Redis服务器的主函数:
在这里插入图片描述
Redis事件循环机制的核心流程图如下所示:
在这里插入图片描述


客户端部分

redis是如何管理连接上来的多个客户端的呢?

具体看下图所示:
在这里插入图片描述


关于客户端输出缓冲区限制

服务器使用两种模式来限制客户端输出缓冲区大小:

  • 硬性限制: 如果输出缓冲区大小超过了硬性限制设置的大小,那么服务器立刻关闭客户端
  • 软性限制:如果输出缓冲区的大小超过了软性限制所设置的大小,但还没超过硬性限制,那么服务器将使用客户端状态结构的obuf_soft_limit_reached_time 属性记录下客户端到达软性限制的起始时间;之后服务器会继续监视客户端,如果输出缓冲区的大小一直超出软性限制,并且持续时间超过服务器设定的时长,那么服务器将关闭客户端;相反地,如果输出缓冲区的大小在指定时间之内,不再超出软性限制,那么客户端就不会被关闭,并且obuf_soft_limit_reached_time属性值会被清零。

使用client-output-buffer-limit选项可以为普通客户端、从服务器客户端、 执行发布与订阅功能的客户端分别设置不同的软性限制和硬性限制,该选项的格式为:

client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>

以下是三个设置示例:

client-output-buffer-limit normal 0 0 0 
client-output-buffer-limit slave 256mb 64mb 60 
client-output-buffer-limit pubsub 32mb 8mb 60

第一行设置将普通客户端的硬性限制和软性限制都设置为0,表示不限制客户端的输出缓冲区大小。

第二行设置将从服务器客户端的硬性限制设置为256MB,而软性限制设置为64MB,软性限制的时长为60秒。

第三行设置将执行发布与订阅功能的客户端的硬性限制设置为32MB,软性限制设置为8 MB,软性限制的时长为60秒。


ServerCron周期函数

serverCron函数默认每隔100毫秒执行一次,这个函数负责管理服务器的资源,并保持服务器自身良好运转,该周期函数每次运行时主要做了下面这些事情:

  • 更新服务器时间缓存和LRU时钟
  • 更新服务器每秒执行命令次数
  • 更新服务器内存峰值记录
  • 处理SIGETERM信号,通过注册该信号的处理函数,可以在redis关闭前进行RDB持久化工作
  • 定期检查一定数量的客户端连接
  • 管理数据库资源,例如: 删除过期键,收缩字典
  • 执行被延迟的bgrewriteaof
  • 检查持久化操作运行状态
    在这里插入图片描述
  • aof缓冲区判断是否需要刷入文件

服务器启动流程

  • 初始化服务器状态
  • 载入服务器配置
  • 初始化服务器数据结构
  • 还原数据库状态(优先选择aof)
  • 执行事件循环

小结

本文主要参考 << Redis 设计与实现 >> 第十二章到第十四章内容。

细节可以看书,或者通过下面的文章进行学习:

Redis(五):Redis的事件循环

socket可读可写条件

Redis原理篇之网络模型

Redis 中的事件循环

Redis多线程网络模型全面解密

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/128297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 中的继承和多态

面向对象的三大特性&#xff1a;封装、继承、多态。在这三个特性中&#xff0c;如果没有封装和继承&#xff0c;也不会有多态。 那么多态实现的途径和必要条件是什么呢&#xff1f;以及多态中的重写和重载在JVM中的表现是怎么样&#xff1f;在Java中是如何展现继承的特性呢&am…

常用密码算法介绍

算法种类 根据技术特征&#xff0c;现代密码学可分为三类&#xff1a; 对称算法 说明&#xff1a;加密密钥和解密密钥相同&#xff0c;对明文、密文长度没有限制 子算法&#xff1a; 流密码算法&#xff1a;每次加密或解密一位或一字节的明文或密文 分组密码算法&#xff…

LiveGBS流媒体平台国标GB/T28181功能-国标流媒体服务平台作为上级接入海康大华华为宇视等下级平台及摄像头

LiveGBS国标流媒体服务平台作为上级接入海康大华华为宇视等下级平台及摄像头1、背景说明2、部署国标平台2.1、安装使用说明2.2、服务器网络环境2.3、信令服务配置3、监控摄像头设备接入3.1、海康GB28181接入示例3.2、大华GB28181接入示例3.3、华为IPC GB28181接入示例4、硬件NV…

mysql 存储过程实现从一张表数据迁移到另一种表

通过存储过程迁移数据&#xff1a; 创建表 CREATE TABLE test1 ( idp varchar(255) DEFAULT NULL, brandIdp varchar(255) DEFAULT NULL, namep varchar(1000) DEFAULT NULL, urlp varchar(1000) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETkeybcs2; INSERT INTO t…

2023美国大学生数学建模竞赛(MCM/ICM)报名流程指南

数模乐园作为国内美赛报名最大官方平台&#xff0c;为参加美赛的同学解决国际支付报名难的问题&#xff0c;为同学们省去大部分繁琐流程的同时还附赠纸质证书打印邮寄、美赛赛题解析、美赛专属礼包、赛题翻译等备赛资料 数模乐园已累计为10万同学完成了美赛辅助报名&#xff0…

Android 音视频编解码(三) -- 视频编码和H264格式原理讲解

Android 音视频编解码(一) – MediaCodec 初探 Android 音视频编解码(二) – MediaCodec 解码(同步和异步) 前面学习了 MediaCodec 的基本原理&#xff0c;以及如何解码&#xff0c;在学习MediaCodec 编码之前&#xff0c;先来学习视频是如何编码的&#xff0c;以及最常用的 H2…

亚马逊vs Starday :做跨境电商生意,从哪里开始?

据有关数据统计&#xff0c;中国跨境电商进出口五年增长近十倍&#xff0c;在一众行业面前脱颖而出&#xff0c;成为我国对外贸易新的增长极&#xff0c;然而也正是这样的趋势&#xff0c;使得许多原本从事电商行业的卖家和资本纷纷闻风而动&#xff0c;想要进入市场分一杯羹&a…

3d打印的翘边问题

如何解决3D打印翘边问题 翘边是3D打印中常见的问题之一。为什么在打印的过程中会遇到翘边呢&#xff1f;主要是因为塑料的热胀冷缩&#xff0c;从喷嘴挤出来的塑料在冷却时候会收缩&#xff0c;进而导致模型边缘或者两头翘了起来与平台出现分离。那么如何避免或解决翘边问题呢…

“消费盲返”爆火,一个月能赚1000w?

寒冬已至&#xff0c;疫情还是在断断续续的复发&#xff0c;很多城市也受到严重的影响&#xff0c;封城的通告一出&#xff0c;无疑是给不少的实体企业增添了相当大的噩耗打击&#xff0c;这时候更为磨炼实体企业和创业人看待事情的立场&#xff0c;有些人会觉得疫情的袭来什么…

SSM框架学习记录-SpringBoot_day01

1.SpringBoot简介 SpringBoot是用来简化Spring应用的初始搭建以及开发过程 先回顾一下SpringMVC的开发过程&#xff1a; 创建工程&#xff0c;并在pom.xml配置文件中配置所依赖的坐标&#xff1a; <dependencies><dependency><groupId>javax.servlet</gro…

阶段性回顾(3)

1. 学习指针必须得了解清楚内存&#xff0c;而内存到底是什么东西呢&#xff1f;内存就是电脑上的存储设备&#xff08;除了内存之外&#xff0c;还有硬盘&#xff0c;寄存器等等&#xff09;&#xff0c;那内存到底是来干啥的呢&#xff1f;程序运行的时候会载入到内存当中&am…

Fast Report .NET 2023.1.7-2022-最后版本

通过使用 Fast Report .NET&#xff0c;用户可以构建和创建本质上独立的应用程序以及报表。网。换句话说&#xff0c;这意味着 Fast Report .NET 可以作为所有用户的独立报告工具独立使用。它可以包括一个强大的可视化报告&#xff0c;用于创建和修改报告的过程。用户应用程序可…

Selenium Webdriver 实现原理详解-手工用Postman调用webdriver执行UI测试

目录 1. Selenium 概述 2. 术语解释&#xff1a; 3. Selenium WebDriver 实现原理 4. 安装selenium 客户端&#xff0c;浏览器&#xff0c;驱动 4.1 安装selenium client lib 4.2 安装浏览器和浏览器驱动 4.3 例子代码 4.4 省略浏览器驱动的方法 4.5 测试代码与Webdr…

Linux近期补充

Linux近期补充Linux命令的近期补充Linux命令的近期补充 1.本地服务器链接远端服务器 命令 ssh 远端服务器ip 如 ssh 121.5.151.236 会弹出 登录框 自己输入密码即可2.当前位置 pwd3.查看网络设备 ifconfig4.查看服务器内存 free -h可以看到还有2.3G内存可以用 5.查看磁盘…

ES学习1~23(ECMAcript相关介绍+ECMASript 6新特性)

1 ECMAcript相关介绍 1.1 什么是ECMA ECMA(European Computer Manufacturers Association)中文名称为欧洲计算机制造商协会&#xff0c;这个组织的目标是评估、开发和认可电信和计算机标准。1994年后该组织改名为Ecma国际。 1.2 什么是ECMScript ECMAScript是由Ecma国际通过…

外网远程访问本地MySQL数据库【cpolar内网穿透】

作为网站运行必备组件之一的数据库&#xff0c;免不了随时对其进行管理维护。若我们没有在安装数据库的电脑旁&#xff0c;但又需要立即对数据库进行管理时&#xff0c;应该如何处理&#xff1f;这时我们可以使用cpolar对内网进行穿透&#xff0c;远程管理和操作MySQL数据库。现…

三叠云甘特图新亮点,可翻页查看数据啦

表单管理 路径 表单 >> 表单设计 功能简介 1.「甘特视图」新增“翻页”功能&#xff0c;用户可以通过翻页查阅更多的数据。 2. 滑动超过显示区域时显示“标记点”&#xff0c;用户可以通过点击标记点快速定位到相应的数据。 3.「列表视图」条件着色功能,修复“系统字…

Linux进程管理

1.什么是程序&#xff1f;具有执行代码和执行权限的文本文件 2.什么是进程&#xff1f;是已启动的可执行程序的运行实例 3.进程的生命周期&#xff1a;由系统程序fork出来的子程序&#xff0c;具备一定的父资源&#xff0c;直到运行完毕 4.进程有哪些组成部分&#xff1f; …

操作系统真相还原_第3章:实模式下跳转指令补充

文章目录数据类型伪指令ret指令call指令jmp指令标志寄存器flags与条件转移数据类型伪指令 byte&#xff1a;字节 word&#xff1a;字 dword&#xff1a;双字 qword&#xff1a;四字 跳转指令指定目标操作数大小 short&#xff1a;字节 near&#xff1a;字 far&#xff1a;双字…

Linux环境下内存泄露检测

linux下内存泄漏检测工具valgrind 该工具可以检测下列与内存相关的问题 : 未释放内存的使用对释放后内存的读/写对已分配内存块尾部的读/写内存泄露不匹配的使用malloc/new/new[] 和 free/delete/delete[]重复释放内存Memcheck。这是valgrind应用最广泛的工具&#xff0c;一个…