redis有哪些内存淘汰策略如何配置(redis中线程安全的方法)

技术Redis中线程IO模型是什么这篇文章将为大家详细讲解有关Redis中线程IO模型是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis是一个单线程的应用程序,NodeJs

本文将详细解释Redis中的线程IO模型是什么。边肖觉得挺实用的,就分享给大家参考。希望你看完这篇文章能有所收获。

Redis是一个单线程应用程序。NodeJs和Nginx都是单线程的,都是高性能服务器的例子。

Redis是单线程可以如此快速的原因:

第一,因为它所有的数据都在内存中,所有的操作都是内存级的操作,所以在使用redis的时候要注意时间复杂度为O(n)的指令,因为是单线程的,如果数据量太大,其他指令会被阻塞等待;

其次,redis使用非阻塞IO和多路复用来处理大量的客户端连接。

非阻塞IO

当我们使用套接字读写方法时,默认情况下它是被阻止的。

也就是说,调用read方法传递一个参数n,这意味着在读取最多n个字节后将返回该参数。如果没有字节,线程将继续在read方法中等待,直到有数据到来或连接关闭。当read方法此时返回时,线程可以执行以下逻辑。

通常,写方法不会阻塞。除非内核为套接字分配的写缓冲区已满,否则写方法将阻塞,直到缓冲区中有可用空间。

下图展示了套接字读写的详细过程。

Redis中线程IO模型是什么

非阻塞IO在使用套接字时提供了一个选项非阻塞。打开此选项时,读写方法不会阻止,而是尽可能多地读取和写入。

你能读多少取决于内核为套接字分配的读缓冲区中的数据字节数,你能写多少取决于内核为套接字写缓冲区分配的数据字节数。

读写方法将通过返回值告诉程序它已经读写了多少字节。

非阻塞IO是指在读写时,线程不必被阻塞,读写可以瞬间完成,线程可以继续做其他事情。

00-1010无阻塞IO非常快,但也带来了一个问题。当线程读取数据时,它会在读取一部分数据后返回,但剩余的数据何时会继续读取?写数据时,缓冲区已满,但还没有写完。剩余数据何时继续写入?

当你可以继续阅读或写作时,你应该给申请人一个通知,告诉申请人你可以继续阅读或写作。事件轮询API用来处理这个问题。

select

系统向用户程序提供选择功能。输入是读写描述符列表read_fds write_fds,输出是对应的可读可写事件。

同时,还提供了超时参数。线程最多可以等待超时。在此期间,当事件到来时,方法将立即返回,线程将向下处理。如果超过超时,该方法也将返回。

如果得到了事件,线程就可以逐个处理对应的事件,然后在处理完之后继续调用select api进行轮询,所以线程其实就是一个无限循环,不停的选择、处理、来回。这个无限循环叫做事件循环,循环就是循环。

Redis中线程IO模型是什么

事件循环伪代码:

当你

read_events,write_events=select(read_fds,write_fds,超时)

foreventinread _ events:

handle_read(event.fd)

foreventinwrite _ events:

handle_write(event.fd)

Handle_others()#执行其他逻辑处理、定时任务等等。我们可以通过select函数处理多个通道描述符的读写事件,所以我们称之为系统函数调用,比如select一个复用API。

现代操作系统的复用API已经从选择系统调用变成了epoll(linux)和kqueue(FreeBSD,macosx)。

当描述符较多时,select的性能会很差。epoll和select略有不同,但两者都可以通过上面的伪代码理解,即当描述符有事件时,描述符的事件循环处理。

serversocket对象的读取操作指的是调用accept来接受客户端的新连接,当连接到来时,它也会被名为select的读取事件通知。

Java中的NIO技术是事件轮询,其他语言也有。

这个技术。

指令队列

Redis为每一个客户端套接字关联一个指令队列,客户端发来的指令通过队列进行先进先出的顺序处理。

响应队列

同样Redis返回的结果也通过为每个客户端关联的一个队列返回,如果队列为空,则暂时不需要去获取写事件,

此时会将该客户端描述符从write_fds里移除,等队列有数据的时候,再将描述符放进去,这样可以避免select系统调用返回写事件时,发现没数据可写,造成空轮询、无用轮询,对机器CPU的消耗。

定时任务

服务器不单要响应IO事件,有些其他的事情也需要处理,例如应用程序自身的定时任务,如果线程阻塞在select调用上,等待select的返回,这会造成有些定时任务到期了,却没有执行,

Redis的定时任务记录在一个称为 最小堆 的数据结构中,这个堆中,最快要执行的任务排在最上方,每个循环周期里,redis会对堆中已经到时间点的任务进行处理,

处理完毕后,将堆中即将要执行的任务还需要的时间记录下来,再次调用select时,这个时间就是timeout的值,在这期间内不会有其他任务需要执行了,redis可以放心的最多阻塞这么久,然后到时间后进行相应的处理。

NodeJs和Nginx的事件处理原理和Redis也是类似的形式。

关于“Redis中线程IO模型是什么”这篇文章就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/154412.html

(0)

相关推荐

  • 权限设置在哪里,设置应用管理怎么开权限

    技术权限设置在哪里,设置应用管理怎么开权限工具/原料:小米6手机权限设置在哪里、手机管家 小米6手机应用管理权限开启操作步骤如下: 1、在手机桌面找到【手机管家】,点击进入【手机管家】;
    2、在【手机管家】界面,

    生活 2021年10月20日
  • 如何进行ADO.NET访问数据库技术分析

    技术如何进行ADO.NET访问数据库技术分析如何进行ADO.NET访问数据库技术分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。着重解释ADO.NET访问

    攻略 2021年12月1日
  • ibatis框架和mybatis框架(ibatis接口mapper怎么写)

    技术如何解析iBATIS DAO框架如何解析iBATIS DAO框架,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。iBATIS DAO框架的书写方便,项目采

    攻略 2021年12月18日
  • mysql GTID复制跳过复制错误的方式有哪些

    技术mysql GTID复制跳过复制错误的方式有哪些这篇文章主要介绍mysql GTID复制跳过复制错误的方式有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、从库执行了事务,主库执行语句时

    攻略 2021年11月6日
  • 如何清洗,如何清洁饮水机才最干净

    技术如何清洗,如何清洁饮水机才最干净饮水机使用长了,就会有很多的污垢,容易产生细菌,那么如何清洗呢如何清洗?现在我来教给大家,希望能帮到您::第一步:断开饮水机的电源,把饮水机中残留的水放干净,一般饮水机后面都有放水口,

    生活 2021年10月28日
  • 设计模式07-装饰模式,Decorator)

    技术设计模式07-装饰模式,Decorator) 设计模式07-装饰模式(Decorator)通过实现与被装饰类实现的相同接口或父类,并将被装饰类作为属性注入到装饰器对象中来完成对装饰器模式的应用。装饰

    礼包 2021年10月28日