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 命令将一个或多个值插入到列表头部. ...
随机推荐
- 多标签caffe重新编译
说明: Caffe自带的图像转LMDB接口只支持单label,对于多label的任务,可以使用HDF5的格式,也可以通过修改caffe代码来实现.本篇文章介绍怎么通过修改DataLayer来实现带Mu ...
- C++ Json解析CJsonObject的详细使用
引用头文件: #include <string> #include <iostream> #include <fstream> #include <casse ...
- C#的排序Sort和OrderBy扩展方法
可以实现一个IComparable接口的CompareTo方法,或者是给予List的Sort扩展方法,传入委托实现,举个例子: list.Sort((a, b) => { var o = a.s ...
- linux系统,关于Python多版本共存
http://www.cnblogs.com/Yiutto/p/5962906.html 给个地址直接看八~
- BZOJ5335 : [TJOI2018]智力竞赛
二分答案,转化成求最少的路径,覆盖住所有权值$\leq mid$的点. 建立二分图,若$i$的后继为$j$,则连边$i\rightarrow j$,求出最大匹配,则点数减去最大匹配数即为最少需要的路径 ...
- Flex布局—语法篇
网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中 ...
- [bzoj1088]扫雷
额,这种水题我也不说什么了233 Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个 ...
- vs2013新建asp.net web 项目报错,此模板尝试加载组件程序集NuGet Package Manage
打开vs2013,工具->扩展和更新->联机->找到NuGet Package Manager->安装->重新启动vs2013
- idea maven cannot resolve symbol http报错问题解决
学习SpringMVC的过程中,在idea中使用maven管理依赖.在class中使用 javax.servlet.http.HttpServletRequest的时候,报错:cannot resol ...
- 5 个免费的受欢迎的 SQLite 管理工具【申明:来源于网络】
5 个免费的受欢迎的 SQLite 管理工具 包含内容: SQLite Expert – Personal Edition SQLite Expert 提供两个版本,分别是个人版和专业版.其中个人版是 ...