博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis——非阻塞IO和队列
阅读量:4599 次
发布时间:2019-06-09

本文共 830 字,大约阅读时间需要 2 分钟。

  Redis是个高并发的中间件,但是确实是单线程。而且,Nginx、Node.js等也是单线程的。Redis通过非阻塞IO(IO多路复用)处理那么多的并发客户端连接,并且,由于Redis所有的数据都在内存中,其所有的操作都是内存级别,因此速度非常快。另一方面,由于Redis是单线程,所以要小心使用Redis的一些指令,尤其是一些复杂度为O(n)的指令,一不小心就会导致Redis卡顿。

非阻塞IO

  linux下非阻塞IO方式有select、epoll等等,关于epoll如何使用可以看这篇博客:。

非阻塞IO的伪代码一般如下:

  如果没有任何事件到来,那么线程最多等待timeout时间,此时线程阻塞。一旦有事件到来,就可以立即返回,timeout时间到了仍然没有事件到来,也立即返回。拿到事件后,线程可以继续挨个处理相应的事件。处理完了,再重新轮询。这个循环一般称为事件循环。

 

指令队列

  Redis会将每个客户端套接字都关联一个指令队列,客户端的指令通过队列来进行顺序处理,先到先服务。

响应队列

  Redis同样为每个客户端套接字关联一个响应队列。Redis通过响应队列来将指令的返回结果回复给客户端。

定时任务

  服务器除了响应IO事件外,还要处理其他任务,比如定时任务。但是当线程处于一个事件循环中,处于阻塞状态,怎样准确调度定时任务呢?

  Redis会将定时任务记录在最小堆中,最近的一个定时任务将在堆的最上方。每个事件循环周期Redis线程都会执行当前的定时任务,在进入下一个事件循环时,将记录下一个最近的定时任务时间,并且将时间差设置为timeout时间。这样子Redis就知道,在timeout时间内没有其他定时任务要做,因此可以安心的阻塞在事件循环中。

  Nginx和Node.js的事件处理原理和Redis类似。

转载于:https://www.cnblogs.com/liangf27/p/10764718.html

你可能感兴趣的文章
【云计算】使用supervisor管理Docker多进程-ntpd+uwsgi+nginx示例最佳实践
查看>>
Ubuntu16.04下配置ssh免密登录
查看>>
实验二 2
查看>>
will-change属性
查看>>
android学习笔记54——ContentProvider
查看>>
Unity3d android开发之触摸操作识别-双击,滑动去噪处理
查看>>
Custom view * is not using the 2- or 3-argument View constructors; XML attributes will not work
查看>>
模型选择准则
查看>>
安卓动态增加按钮
查看>>
iOS7程序后台运行
查看>>
maven+testng+reportng的pom设置
查看>>
IT telephone interview
查看>>
gitlab安装配置
查看>>
ps载入画笔
查看>>
悲怆:IT人的一声叹息->一个程序员的自白[转帖]
查看>>
[SpringMVC]自定义注解实现控制器访问次数限制
查看>>
日记(序)
查看>>
A == B ?
查看>>
洛谷P3763 [Tjoi2017]DNA 【后缀数组】
查看>>
GSM模块_STM32实现GPRS与服务器数据传输经验总结
查看>>