目录
珞Redis线程理解
单线程/多线程
I/O多路复用
Redis为什么快?
这里是CS大白话专场,让枯燥的学习变得有趣!
没有对象不要怕,我们new一个出来,每天对ta说不尽情话!
好记性不如烂键盘,自己总结不如收藏别人!
珞Redis线程理解
单线程/多线程
Redis到底是单线程还是多线程???现在如果再简单地说它是单线程的,那你就out啦!
Redis5.x及之前的版本确实都是单线程的,它的工作机制是这样滴:
这样的处理流程会导致一个问题,就是进程阻塞,当请求1的I/O阻塞时,整个进程都无法对其他客户端提供服务。而Redis6.x之后的工作机制是这样滴:
可以看到,Redis的工作进程只有一个,广义上还是单线程的,但是新版本的Redis将读取和返回IO的操作交由IO子进程进行,工作进程只负责执行指令,与旧版本相比,创建子进程大大降低了处理时间。
I/O多路复用
简单了解了Redis的工作机制,我们可以发现Redis采用了多路复用技术,它具体是咋实现的捏?
首先,多路复用机制大致分为以下三种:
select/poll:这两种采用无差别轮询模式,如果没有接收到数据,则进程进入阻塞态,当进程被唤醒时,需要遍历每个socket判断哪个socket接收到了数据。这种方式需要不断在用户态和内核态之间拷贝fd集合,时间复杂度为O(N)。而且,select基于数组存储,有最大连接数限制(1024/x32,2048/x64),poll是基于链表存储故没有限制。
epoll:采用回调模式,只需要管理有事件发生的socket,复杂度为O(1),在socket连接数量较大而活跃连接较少时epoll更高效,其主要调用如下三个函数:
epoll_creat():创建epoll对象,返回一个非负值的文件描述符epfd,调用失败返回-1。
epoll_ctl():在epfd上绑定、修改或解绑需要检测的socket。
epoll_wait():等待数据。
Redis主要就是基于epoll实现的。
Redis为什么快?
基于内存,内存的读写速度快;
避免了消耗CPU内核的线程切换;
单个Redis线程不需要考虑加锁放锁等问题;
多路复用处理并发连接;
数据结构简单。



