redis-io模型
单线程的程序有哪些?
nginx node.js redis
单线程为什么快
全是内存运算,数据都在内存里面.
On级别的命令有哪些?
注意事项
On级别的命令尽量少使用,会导致redis卡顿.
理解IO多路复用(事件驱动)
io阻塞
来多少个线程就夯住多少个,每个线程等到结果才会返回
io非阻塞
来多少个线程,都看能不能处理,不能立刻返回;
非阻塞 IO 在套接字对象上提供了一个选项Non_Blocking,当这个选项打开时,读写方法不会阻塞,
而是能读多少读多少,能写多少写多少。能读多少取决于内核为套接字分配的读缓冲区内部的数据字节数,
能写多少取决于内核为套接字分配的写缓冲区的空闲空间字节数。读方法和写方法都会通过返回值来告知程序实际读写了多少字节
事件轮询(多路复用)
多路复用API: select(linux->epoll)系统调用同事处理多个通道描述符的读写事件.(select在系统调用在描述符特别多的情况下性能会非常差).
指令队列
客户端的指令通过队列来排队进行顺序处理,先到先服务.
响应队列
redis 服务器通过响应队列来将指令的返回结果回复给客户端,
如果队列为空,那么意味着连接暂时处于空闲状态,不需要去获取写事件,
也就是可以将当前的客户端描述符从write_fds里面移出来。等到队列有数据了,
再将描述符放进去。避免select系统调用立即返回写事件,结果发现没什么数据可以写。
出这种情况的线程会飙高 CPU
学习记录
同步和异步的概念
1.同步与异步是站在消息通知机制角度来说的(同步可能需要时刻去关心询问线程处理结果,异步注册了回调机制,无需关心)
2.阻塞和非阻塞是站在线程等待调用结果的线程状态这个角度来说的,阻塞则是线程挂起等待调用结果返回;
非阻塞是在等待结果的过程中,线程任然是活动状态,可能处理其他的任务罢了。
redis的单线程
redis对外的网络请求服务是单线程的,在redis内部其他模块还是多线程的操作的,比如bgsave等等
redis的定时任务
java 的Timer使用的是最小堆,redis仅仅是链表遍历
网友评论