`

redis 事件处理机制及其它

阅读更多

关于redis的事件处理机制,网上有很详细的源码解析了,基于2.0.4的,URL如下:
redis源代码分析8–事件处理(上)

redis源代码分析8–事件处理(中)

redis源代码分析8–事件处理(下)


小总结:

初始化:在redis.c中initServer调用aeCreateEventLoop,并建立了现有唯一的一个time event:serverCron.
使用:在redis.c中main
1) 调用aeSetBeforeSleepProc设置beforeSleep函数,我看的源码是2.2.1的,功能比2.0.4稍作改变,加上了处理之前等待BLPOP的已经unblock的clients的功能.
2) 调用aeMain进入主循环,循环调用beforesleep和aeProcessEvents.程序出口在serverCron中,若接收到SIGTERM,则调用prepareForShutdown,随后退出.
  2.1) 在Ae.c中aeProcessEvents,先处理file event,然后处理time event.小trick:先算好最近的time event的expire的时间(aeSearchNearestTimer),传给aeApiPoll,因此处理完file event以后,马上就可以处理time event.尤其当aeApiPoll使用反射机制的epoll和kqueue时,不会白白占用CPU时间来轮询.

顺便补上select,epoll,kqueue的比较资料:

---------------------<<以下来源于iteye >>-------------------------
先说select :
1.Socket数量限制:该模式可操作的Socket数由FD_SETSIZE决定,内核默认32*32=1024.
2.操作限制:通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍.
后说poll:
1.Socket数量几乎无限制:该模式下的Socket对应的fd列表由一个数组来保存,大小不限(默认4k).
2.操作限制:同Select.
再说:epoll:
1.Socket数量无限制:同Poll
2.操作无限制:基于内核提供的反射模式,有活跃Socket时,内核访问该Socket的callback,不需要遍历轮询.

大部分情况下,反射的效率都比遍历来的高,但是当所有Socket都活跃的时候,反射还会更高么?这时候所有的callback都被唤醒,会导致资源的竞争.既然都是要处理所有的Socket,那么遍历是最简单最有效的实现方式.

举例来说:
对于IM服务器,服务器和服务器之间都是长链接,但数量不多,一般一台60\70个,比如采用ICE这种架构设计,但请求相当频繁和密集,这时候通过反射唤醒callback不一定比用select去遍历处理更好.
对于web portal服务器,都是浏览器客户端发起的http短链接请求,数量很大,好一点的网站动辄每分钟上千个请求过来,同时服务器端还有更多的闲置等待超时 的Socket,这时候没必要把全部的Socket都遍历处理,因为那些等待超时的请求是大多数的,这样用epoll会更好.
---------------------<<blow from stackovelflow>>-------------------------
poll / select
1) Two flavours (BSD vs. System V) of more or less the same thing.
2) Somewhat old and slow, somewhat awkward usage, but there is virtually no platform that does not support them.
3) Waits until "something happens" on a set of descriptors
   3.1) Allows one thread/process to handle many requests at a time.
   3.2) No multi-core usage.
4) Needs to copy list of descriptors from user to kernel space every time you wait. Needs to perform a linear search over descriptors. This limits its effectiveness.
5) Does not scale well to "thousands" (in fact, hard limit around 1024 on most systems, or as low as 64 on some).
6) Use it because it's portable if you only deal with a dozen descriptors anyway (no performance issues there), or if you must support platforms that don't have anything better. Don't use otherwise.

epoll

1) Linux only.
2) Concept of expensive modifications vs. efficient waits:
   2.1) Copies information about descriptors to kernel space when descriptors are added (epoll_ctl)
3) This is usually something that happens rarely.
   3.1) Does not need to copy data to kernel space when waiting for events (epoll_wait)
     This is usually something that happens very often.
   3.2) Adds the waiter (or rather its epoll structure) to descriptors' wait queues
     3.2.1) Descriptor therefore knows who is listening and directly signals waiters when appropriate rather than waiters searching a list of descriptors
     3.2.2) Opposite way of how poll works 

     3.2.3) O(1) and very fast instead of O(n)
4) Works very well with timerfd and eventfd (stunning timer resolution and accuracy, too).
5) Some minor pitfalls:
   5.1) An epoll wakes all threads waiting on it (this is "works as intended"), therefore the naive way of using epoll with threads is useless.
   5.2) Does not work as one would expect with file read/writes ("always ready").
   5.3) Could not be used with AIO until recently, now possible via eventfd, but requires a (to date) undocumented function.


kqueue
1) BSD analogon to epoll, different usage, similar effect.
2) Rumoured to be faster (I've never used it, so cannot tell if that is true).

分享到:
评论

相关推荐

    Redis经典面试题:redis是单线程架构还是多线程架构

    此外,为了提升单线程的运行效率,Redis使用了Event Loop机制,这种机制可以以非常高效的方式轮询所有的事件,并且在管理和计算事件时不会阻塞同时进行的其他数据请求。 缓存穿透、缓存雪崩以及缓存击穿。缓存穿透...

    Java开发面试-Redis专区

    在面试中,面试官可能会问到Redis的基本概念和特点,例如持久化机制、数据类型、过期策略、事务操作等,以及与其他缓存系统的区别和优势。其次,对于Java开发者来说,熟悉Redis的Java客户端也是必要的。在面试中,...

    redis_window_7.0.0

    最新版redis7.0.0 几乎包括了对各个方面的增量改进,包括几个面向用户的新功能、显著的性能优化和许多其他改进。它还包括可能破坏与旧版本向后兼容性的更改。与此同时,Redis 7.2 的开发在进展中。 新功能如下: 1....

    Redis学习笔记—Redis事务

    前言 Redis事务可以一次执行多个命令(按顺序地串行执行,执行中不会被其他命令插入,不许加塞) 1.简介 Redis事务可以一次执行多个命令(允许在一次单独的步骤中执行一组...2.事务的处理的阶段与错误处理机制 [1] 三个阶

    Redis主从复制、持久化、哨兵

    (一)Redis集群的主从复制 概念 主从备份,防止主机宕机 读写分离,分担master的任务 任务分离,如从服务节点分担备份与计算工作 主从复制特点 1:master 可以拥有多个 slave 2:多个 slave 可以连接同一个 master ...

    JerryQuu:使用Typescript编写的Node.js的快速,可靠的基于Redis的电子邮件队列

    如果您正在构建一个小型项目,并且不想处理诸如SQS之类的东西,并且已经在应用程序中以某种或其他方式利用Redis,请使用JerryQuu。 我为我的一个小型项目构建了此工具,并认为对于不想进入SQS但想在其Node.js应用...

    数据倾斜优化方案

    数据倾斜指的是,并行处理的数据集中,某一部分(如Spark或Kafka的一个Partition)的数据显著 多于其它部分,从而使得该部分的处理速度成为整个数据集处理的瓶颈。 如果数据倾斜没有解决,完全没有可能进行性能调优...

    htq:排队 HTTP 请求并将响应存储在 Redis 中以供以后检索

    服务器将继续使用其他任务或请求处理程序可能正在使用的资源来执行任务。 发出取消信号的机制是将后续的 DELETE 请求发送到可以处理中断第一个请求的服务。 这当然需要服务支持 DELETE 方法并实现取消正在执行的...

    网页版微信,集成redis,mysql,knife4j,websocket等技术

    用户可以通过网页版微信方便地管理和交流,包括撤回发送的消息、查看好友列表、处理好友申请、分享生活动态到朋友圈、群发消息给多个好友或群聊、私发消息进行一对一沟通、创建群聊以便多人交流、查询其他用户的信息...

    Practical-redis:这本书的代码-Practical Redis

    其他关键功能-事务,Pub Sub消息传递,排队,Lua脚本编写,处理无限数据流的能力 Redis还提供-可调整的持久性机制,用于高可用性的Sentinel和用于数据分片/分区的Redis集群 使用模式包括(但不限于)键值数据库,...

    基于scrapy-redis实现分布式爬虫.zip

    爬取知乎所有问题及对应的回答,集成selenium模拟登录、英文验证码及倒立文字验证码识别、随机生成User-Agent、IP代理、处理302重定向问题等等 爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其...

    基于SpringBoot+Shiro+JWT+Redis 小R商城 后台管理系统 的后端项目.zip

    基于SpringBoot+Shiro+JWT+Redis+MongoDb+Mysql 进行实现的 主要包括 装修页面、商品管理、订单管理、活动管理、优惠券管理、权限管理等 MySQL 是一款广受欢迎的开源关系型数据库管理系统(RDBMS),由瑞典MySQL AB...

    基于SpringBoot+Shiro+Redis+Jwt+Thymeleaf+MyBatis 开发的后台用户、角色+源代码+文档

    # Geek-Framework 微服务快速开发脚手架 ...3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    使用 Koa + MongoDB + Redis 搭建论坛系统.zip

    安全系统: 旨在保护计算机系统免受恶意攻击、未经授权访问、数据泄露等安全威胁的措施和工具,包括防火墙、入侵检测系统、防病毒软件、身份认证与访问控制机制、数据加密技术等。 综上所述,计算机领域的“系统”...

    java带有分布式锁的抢红包功能源码.zip

    这个示例代码使用了Redis作为分布式锁的存储和同步机制。首先,每个用户在抢红包之前都会尝试获取一个分布式锁,以防止多个用户同时抢到同一个红包。在获取分布式锁的过程中,如果锁已经被其他用户获取,则当前用户...

    基于 gin+gorm+redis+mysql 读写分离的电子商城.zip

    自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

    基于SSH+Redis+MySQL的IM即时聊天系统实现.zip

    自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

    基于Vue+SpringBoot+Redis+MySQL的网上订餐系统.zip

    自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

    基于springboot后台框架,涉及技术,通用mapper,shiro,mysql,redis.zip

    自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

    基于SpringBoot+Redis+Mybatis+MySQL+RabbitMQ技术的仿大众点评项目.zip

    自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

Global site tag (gtag.js) - Google Analytics