目录

🤗Redis线程理解

单线程/多线程

I/O多路复用

Redis为什么快?


💟这里是CS大白话专场,让枯燥的学习变得有趣!

💟没有对象不要怕,我们new一个出来,每天对ta说不尽情话!

💟好记性不如烂键盘,自己总结不如收藏别人!

🤗Redis线程理解

单线程/多线程

💌Redis到底是单线程还是多线程???现在如果再简单地说它是单线程的,那你就out啦!

Redis5.x及之前的版本确实都是单线程的,它的工作机制是这样滴:

redis7 与redis5性能 redis5和redis6的区别_redis

 

这样的处理流程会导致一个问题,就是进程阻塞,当请求1的I/O阻塞时,整个进程都无法对其他客户端提供服务。而Redis6.x之后的工作机制是这样滴:

redis7 与redis5性能 redis5和redis6的区别_redis7 与redis5性能_02

💌可以看到,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线程不需要考虑加锁放锁等问题;

🍠多路复用处理并发连接;

🍠数据结构简单。