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)

相关推荐

  • spark运行机制

    技术spark运行机制 spark运行机制构建DAG(Driver 端完成)
    使用算子操作 RDD 进行各种 Transformation 操作,最后通过 Action 操作触发 Spark 作业运行。

    礼包 2021年11月1日
  • 如何分析Spring AOP设计与原理

    技术如何分析Spring AOP设计与原理这篇文章给大家介绍如何分析Spring AOP设计与原理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。java程序执行——方法调用在学java基础我们就知道

    攻略 2021年12月3日
  • oraclenumber型深度解析(oracle逻辑读是读哪里的数据)

    技术怎样浅析Oracle的物理读 逻辑读 一致性读 当前模式读怎样浅析Oracle的物理读 逻辑读 一致性读 当前模式读,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简

    攻略 2021年12月20日
  • 31种土豆家常做法,土豆有多少种做法

    技术31种土豆家常做法,土豆有多少种做法来给你说点家常的做法 131种土豆家常做法、最简单的做法就是酸辣土豆丝(土豆片)了。。。
    佐料有:干辣皮(切成段),葱(切成段),蒜(切成片),青椒(切成丝)
    首先把土豆切好,

    生活 2021年10月30日
  • 容斥问题公式,详细解释一下3个以上的容斥定理

    技术容斥问题公式,详细解释一下3个以上的容斥定理这是摩根公式 和 容斥定理 (A交B)的补==(A的补)并(B的补)
    (A并B)的补==(A的补)交(B的补)
    补==取补集
    并==取并集
    交==取交集

    生活 2021年10月26日
  • Java处理异常的方法有哪些

    技术Java处理异常的方法有哪些这篇文章主要讲解了“Java处理异常的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java处理异常的方法有哪些”吧!  一、异

    攻略 2021年10月30日