目录
🤗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线程不需要考虑加锁放锁等问题;
🍠多路复用处理并发连接;
🍠数据结构简单。