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 命令将一个或多个值插入到列表头部. ...
随机推荐
- notes for lxf(一)
python代码不能用word和windows自带的记事本保存 word保存的不是纯文本文件 记事本会在文件开始的地方加上特殊字符(UTF-8 BOM) 交互模式启动了解释器 直接运行.py文件是一次 ...
- windows下apache+https环境配置
windows下apache+https环境配置 转 https://www.cnblogs.com/sandaizi/p/7519370.html 1.修改配置文件conf/httpd.conf,去 ...
- Java EE ----- Container/Injection
容器(container)是一个类,实际上是component的子类,因此容器本身也是一个组件,具有组件的所有性质,但是它的主要功能是容纳其他组件和容器. 对于开发人员,需要引入复杂的代码解决事务以及 ...
- PBRT笔记(7)——反射模型
基础术语 表面反射可以分为4大类: diffuse 漫反射 glossy specular 镜面反射高光 perfect specular 完美反射高光 retro-reflective distri ...
- 命令行 app
[Getting Title at 38:53](http://click.pocoo.org/5/) 其实在 实际操作中 如果参数特别多的话,最好使用配置文件来操作,比如 yaml [YAML 语言 ...
- acl权限命令
1.查看acl命令 getfacl 文件名 #查看acl权限 2.设定acl权限命令 setfacl 选项 文件名 选项: -m 设置ACL权限 -x 删除指定的ACL权限 -b 删除所有的ACL设定 ...
- 无法在Application Designer中打开PeopleTools对象
PeopleSoft开发人员经常使用PeopleSoft Application Designer来查看/修改PeopleTools对象,例如字段,记录,页面,组件等.开发人员对Application ...
- mysql学习2
1.视图 视图是一个虚拟表(非真实存在),其本质是[根据sql语句获取动态的数据集,并为其命名],用户使用时只需要使用[名称]即可获取结果集,并可以将其当作表来使用. 搜索临时表 SELECT * F ...
- Java-IO流之BufferedReader 和BufferedWriter的使用和原理
BufferedReader和BufferedWriter出现的目的是为了对FileReader以及FileWriter的读写操作进行增强,而怎么增强呢,原理类似于使用StringBuilder,是把 ...
- 2.10linux学习(2)
2019-2-10 19:34:27 跟着超哥学Linux 发现蛮好玩的!适合开发,Windows适合娱乐! 可以跟着超哥学Linux 参考:https://www.cnblogs.com/pyyu/ ...