redis 系列18 事件
一.概述
Redis服务器是一个事件驱动程序,服务器需要处理两类事件:1文件事件,2时间事件。文件事件是关于客户端与服务器之间的通信操作。时间事件是关于服务器内部的一些定时操作。本篇还是参照"Redis设计与实现"书,简要了解下Redis事件。
1. 文件事件
文件事件(file event)是服务器对套接字操作的抽象(套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点),通过套接字与客户端或者其它Redis服务器进行连接,服务端与客户端的通信产生相应的文件事件,服务器则通过监听并处理这些文件事件来完成一系列网络通信操作。
Redis基于Reactor(反应器)模式开发了自己的网络事件处理器,这个处理器被称为文件事件处理器。文件事件处理器使用I/O多路复用程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。
当被监听的套接字准备好执行连接应答,读取,写入,关闭等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。
文件事件处理器包括套接字,I/O多路复用程序,文件事件分派器,事件处理器。下面展示了四个组成部分。

当多个套接字做连接,写入,读取,关闭等命令操作时,就会产生多个并发文件事件。I/O多路复用程序负责监听多个套接字放入队列中,然后通过队列,以有序,同步,每次一个套接字的方式向文件事件分派器传送, 当上一个套接字产生的事件被处理后,事件分派器会继续传送下一个套接字。
下面简单描述一个通信过程:(1)当一个Redis客户端向服务器发起连接,那么监听套接字将产生ae_readable事件(该事件是指当客户端对套接字执行write,close,connect操作),触发连接应答处理器执行。 该处理器会对客户端的连接请求进行应答,然后创建客户端套接字,客户端状态。使得客户端可以向服务器发送命令请求。
(2)执行客户端命令后将产生相应的命令回复,为了将这些命令回复传送回客户端,服务器会将客户端套接字的ae_writable事件(该事件是指客户端对套接字执行read操作)与命令回复处理器进行关联,当客户端尝试读取命令回复的时候,会触发命令回复处理器执行。

2.时间事件
时间事件(time event)是Redis服务器中的一些操作如serverCron函数,需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。时间事件分为两类: 1定时事件:让一段程序在指定的时间之后执行一次。2.周期性事件:让一段程序每隔指定时间表就执行一次。
持续运行的Redis服务器需要定期对自身资源和状态进行检查和调整,从而确保服务器可以长期,稳定的运行,主要工作包括:
(1) 更新服务器的各类统计信息,比如时间,内存占用,数据库占用情况等。
(2) 清理数据库中的过期键值对。
(3) 关闭和清理连接失败的客户端。
(4) 尝试进行AOF和RDB持久化操作。
(5) 如果服务器是主服务器,那么对从服务器进行定期同步。
(6) 如果处于集群模式,对集群进行定期同步和连接测试。
Redis服务器对周期性事件的方式运行redis.c/serverCron函数,直到服务器关闭为止。在配置上,用户通过修改hz选项来调整serverCron的每秒执行次数。默认是每秒执行10次。
127.0.0.1:> config get hz
) "hz"
) ""
redis 系列18 事件的更多相关文章
- 【目录】redis 系列篇
随笔分类 - redis 系列篇 redis 系列27 Cluster高可用 (2) 摘要: 一. ASK错误 集群上篇最后讲到,对于重新分片由redis-trib负责执行,关于该工具以后再介绍.在进 ...
- redis系列-14点的灵异事件
概述 项目组每天14点都会遭遇惊魂时刻.一条条告警短信把工程师从午后小憩中拉回现实.之后问题又神秘消失.是PM喊你上工了?还是服务器给你开玩笑?下面请看工程师如何一步一步揪出真凶,解决问题. 如果不想 ...
- Java 集合系列18之 Iterator和Enumeration比较
概要 这一章,我们对Iterator和Enumeration进行比较学习.内容包括:第1部分 Iterator和Enumeration区别第2部分 Iterator和Enumeration实例 转载请 ...
- Python操作redis系列之 列表(list) (四)
# -*- coding: utf- -*- import redis r =redis.Redis(host=,password="ZBHRwlb1608") 1. Lpush ...
- redis 系列25 哨兵Sentinel (高可用演示 下)
一. Sentinel 高可用环境准备 1.1 Sentinel 集群环境 环境 说明 操作系统版本 CentOS 7.4.1708 IP地址 172.168.18.200 网关Gateway 1 ...
- redis 系列20 服务器下
二. serverCron函数 2.3 更新服务器每秒执行命令次数 serverCron函数中的trackOperationsPerSecond函数会以每100毫秒一次的频率执行,这个函数以抽样计算的 ...
- Python操作redis系列之 列表(list) (五)(转)
# -*- coding: utf-8 -*- import redis r =redis.Redis(host=") 1. Lpush 命令将一个或多个值插入到列表头部. 如果 key 不 ...
- Redis系列(二):Redis的数据类型及命令操作
原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...
- Python操作redis系列之 列表(list) (五)
# -*- coding: utf- -*- import redis r =redis.Redis(host=,password=") 1. Lpush 命令将一个或多个值插入到列表头部. ...
随机推荐
- 关于<软件>的定义
百度百科: 软件是一系列按照特定顺序组织的计算机数据和指令的集合.一般来讲软件被划分为系统软件.应用软件和介于这两者之间的中间件. 国标中的定义: 与计算机系统操作有关的计算机程序.规程.规则,以及可 ...
- linux 端口占用
进程id为9106,进程名称为java的进程,占用了8080端口(监听了8080端口)
- python控制语句---循环结构语句
这次主要把循环结构的控制语句补上,主要包含while.for.continue.break.循环嵌套.主要写一些基本的认识以及包含的一些实例.当只有唯一路径且只跑一次的时候选择上一节中的选择结构语句就 ...
- docker-compose模板文件
mysql.redis.asp.net core项目应用程序三个常见的docker-compose文件模板参考: version: "3" services: mysql: res ...
- 【ABP.Net】2.多数据库支持&&初始化数据库
abp默认连接的数据库是MSSQL,但是在开发过程中往往很多开发者不满足于mssql. 所以这里演示一下把mssql改成postgresql,来进行接下来的系统开发. abp的orm是用EF的.那么我 ...
- 利用kibana插件对Elasticsearch查询
利用kibana插件对Elasticsearch查询 Elasticsearch是功能非常强大的搜索引擎,使用它的目的就是为了快速的查询到需要的数据. 查询分类: 基本查询:使用Elasticsear ...
- AI零基础入门之人工智能开启新时代—下篇
人工智能概述 人工智能的定义 · 人工智能是通过机器来模拟人类认识能力的一种科技能力 · 人工智能最核心的能力就是根据给定的输入做出判断或预测 · 思考:通过什么途径才能让机器具备这样的能力? · 举 ...
- MyBatis3系列__03几个常用的属性配置
本文主要讲几个xml配置属性: 其都写在mybatis配置文件中 1.properties属性:其作用主要是可以动态引进外部的配置文件中的相关配置 resource:引入类路径下的资源 url:引入网 ...
- Unity-批量修改Prefab上的属性
问题描述:今天发现工程中有些prefab上的脚本丢失了一些引用,本以为手动拖拽上去搞定,后来查看其它prefab,也有类似的问题,于是写了一个小工具,批量修改下. 上代码: [ExecuteInEdi ...
- modbus tcp数据报文结构
modbus tcp数据报文结构 请求:00 00 00 00 00 06 09 03 00 00 00 01 响应:00 00 00 00 00 05 09 03 02 12 34 一次modbus ...