当前位置: 首页 > news >正文

网站做app的重要性如何让百度快速收录

网站做app的重要性,如何让百度快速收录,网站排名靠前方法,云建站管理区引言 Redis是个单线程程序!这点必须铭记。除了Redis之外,Node.js也是单线程,Nginx也是单线程,但是他们都是服务器高性能的典范。 Redis单线程为什么能够这么快! 因为他所有的数据都在内存中,所有的运算都…

引言

Redis是个单线程程序!这点必须铭记。除了Redis之外,Node.js也是单线程,Nginx也是单线程,但是他们都是服务器高性能的典范。

Redis单线程为什么能够这么快! 因为他所有的数据都在内存中,所有的运算都是内存级别的运算。正因为Redis是单线程,所以要小心使用Redis指令,对于那些时间复杂度为O(n)级别的指令,一定要谨慎使用,一不小心可能就会导致Redis卡顿。

Redis单线程如何处理那么多的并发客户端连接! 其答案就是多路复用

非阻塞IO

Redis使用基于事件的非阻塞IO模型,这种模型使得Redis能够在不阻塞主线程的情况下,同时处理多个客户端连接。Redis使用IO多路复用技术,通常是select、epoll、kqueue,这取决于运行Redis的操作系统。这些技术允许单个线程监视多个文件描述符,以检测是否有IO操作成为可能,例如数据可读或者可写。

读写过程

  • 读操作:当客户端发送命令到Redis服务器时,服务器使用非阻塞socket读取命令。命令读取完成后,单线程执行命令并处理数据
  • 写操作:处理完客户端命令后,生成的输出将通过非阻塞socket发送回客户端,如果数据无法一次性发送完毕(例如,输出缓冲区已满),剩余的数据会被缓存,并在socket可写时继续发送。

事件轮询(多路复用)

非阻塞IO有个问题,那就是线程要读数据,结果读了一部分就返回了,线程如何知道何时才应该继续读。也就是当数据到来时,线程如何得到通知,写也是一样,如果缓冲区满了,写不完,剩下的数据何时才能继续写,线程也应该得到通知。
在这里插入图片描述

事件轮询API就是用来解决这个问题的,最简单的事件轮询API是select函数,他是操作系统提供给用户程序的API。输入是读写描述符列表read_fds&write_fds, 输出是与之对应的可读可写事件。同时还提供了一个timeout参数,如果没有任何事件到来,那么就最多等待timeout时间,线程处于阻塞状态。一旦期间有任何事件到来,就可以立即返回。时间过了之后还是没有任何事件到来,也会立即返回。拿到事件后,线程就可以继续挨个处理相应的事件。处理完了继续过来轮询。于是线程就进入了一个死循环,我们把这个死循环称为事件循环,一个循环为一个周期。

每个客户端套接字socket都有对应的读写文件描述符。

read_events, write_events = select(read_fds, write_fds, timeout) 
for event in read_events:handle_read(event.fd) 
for event in write_events:handle_write(event.fd)
handle_others() # 处理其它事情,如定时任务等

因为我们通过select系统调用同时处理多个通道描述符的读写事件,因此我们将这类系统调用称为多路复用API。现代操作系统的多路复用API已经不再使用select系统调用,而改用epoll(linux)和kqueue(freebsd&macosx),因为select系统调用的性能在描述符特别多时性能会非常差。他们使用起来可能在形式上略有差异,但是本质上差不多,都可以使用上面的伪代码进行理解。

服务器套接字serversocket对象的读操作指调用accept接受客户端新连接,何时有新连接到来,也是通过select系统调用的读事件来得到通知。

指令队列

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

响应队列

Redis同样也为每个客户端套接字关联一个响应队列。Redis服务器通过响应队列来将指令的返回结果返回给客户端。如果队列为空,那么意味着连接暂时处于空闲状态,不需要去获取写事件,也就是可以将当前的客户端描述符从write_fds里面移除,等到队列有数据了,再将描述符放进去,避免select系统调用立即返回写事件,如果发现没什么数据可以写。出这种情况的线程会飙高CPU。

定时任务

服务器除了要响应IO事件外,还要处理其他事情。比如定时任务就是非常重要的一件事,如果线程阻塞在select系统调用上,定时任务将无法得到准时调度。那么Redis是如何解决的呢。

Redis的定时任务会记录在一个称为最小堆的数据结构中,这个堆中,最快要执行的任务排在堆的最上方,在每个循环周期,Redis都会将最小堆里面已经到点的任务立即进行处理。处理完毕后,将最快要执行的任务还需要的时间记录下来,这个时间就是select系统调用的timeout参数。因为Redis知道未来timeout时间内,没有其他定时任务需要处理,所以可以安心睡眠timeout时间。

总结

Redis单线程,利用IO多路复用技术,单线程监听多个文件描述符,并进行事件轮询(单线程循环),轮询期间如果发生可读事件,从缓冲区中读取事件并进行处理,处理完后再将数据发送到写缓冲区写回给客户端。轮询通过select(read_fds, write_fds, timeout) 函数进行,其中timeout为轮询阻塞时间。

http://www.dinnco.com/news/81902.html

相关文章:

  • 黑河做网站公司百度首页优化排名
  • 总结网站推广策划思路的内容搜索引擎优化seo培训
  • wordpress4.7 php版本2020 惠州seo服务
  • 营销型手机网站中国站长站
  • 做网站书籍重庆人社培训网
  • ppt做的模板下载网站有哪些内容电商培训机构
  • 互联网创业项目怎么做山西网络营销seo
  • 广州网站商城建设线下推广方式
  • wordpress form manager 中文百度搜索引擎优化案例
  • 国外优秀的企业网站谷歌浏览器免费入口
  • 网站设计的指导思想湖南官网网站推广软件
  • 政府类免费网站模板免费百度seo引流
  • 免费做宣传单页的网站链接式友谊
  • 快照首页排名优化服务安徽seo网络推广
  • 湛江模板建站平台seo也成搜索引擎优化
  • 网站的建设包括网站运营师
  • 做网站的图片要求大小房地产网站建设
  • 做网站哪些公司好怎么快速优化关键词排名
  • 苏州知名网站制作seo是干啥的
  • 网站设计费用明细最新战争新闻事件今天
  • 思源黑体 wordpress厦门seo关键词优化培训
  • 目前做网站的公司有哪些福清seo
  • 宣传旅游网站建设的重点是什么济南计算机培训机构哪个最好
  • 做网站是怎样赚钱的广点通和腾讯朋友圈广告区别
  • 怎么通过做网站赚钱口碑好网络营销电话
  • 汕头网站优化google下载官方版
  • 视频号推广入口甘肃省seo关键词优化
  • 网站商城定制网站建设文件关键词搜索工具
  • 网站用图片做背景图片淘宝店铺运营
  • 网站建设主管招聘最新军事新闻