身在福中不知福是什么?就是发福快发成猪了,还觉得自己身材蛮OK
很多时候,别人会问redis 为什么能支持十几万的请求,我们一般都是知其然而不知所以然,下面就带大家粗略了解一下
1、纯内存K-V操作
数据库的工作模式按存储方式分为了磁盘数据库和内存数据库。Redis将数据存储在内存中,并且绝大多数命令都不会受到磁盘 IO 速度的限制,所以速度极快。此外,Redis内部采用了 HashMap 这种数据结构,从根本上获得了优势,因为 HashMap 无论是查找和操作的时间复杂度都是O(1);
2、采用了多路复用的I/O机制
Redis是单线程的,但它底层使用了多路复用 I/O 机制。多路 /O 复用模型是指利用select、poll、epoll 同时监察多个流的 I/O 事件,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒。程序会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法避免了大量的无用操作。
3、数据结构简单,操作节省时间
Redis对数据结构做了很多优化,诸如压缩表、对短数据进行压缩存储、跳表等,都加快了读取速度
4、redis 是单线程的,这一点毋庸置疑(注意,Redis 6.0 网络读写部分是多线程的)
注意:Redis 的瓶颈并不在线程,也不在获取CPU资源,而往往是网络带宽和计算机的内存大小,这也就是 Redis 使用单线程的原因;
单线程的优点:
- 省去上下文切换:上下文不难理解,就是CPU寄存器和程序计数器。主要作用就是存放没有被分配到资源的线程,多线程操作的时候,不是每一个线程都能够直接获取到CPU资源的,我们之所以能够看到我们电脑上能够运行很多的程序,是应为多线程的执行和CPU不断对多线程的切换。但是总有线程获取到资源,也总有线程需要等待获取资源,这个时候,等待获取资源的线程就需要被挂起,也就是我们的寄存。这个时候我们的上下文就产生了,当我们的上下文再次被唤起,得到资源的时候,就是我们上下文的切换;
- 避免竞争资源:竞争资源相对来说比较好理解,CPU对上下文的切换其实就是一种资源分批,但是在切换之前,到底切换到哪一个上下文,就是资源竞争的开始。在 Redis 中由于是单线程的,所以所有的操作都不会涉及到资源的竞争;
- 避免锁的消耗:对于多线程的来讲,不能回避的就是锁的问题。如果说多线程操作出现并发,有可能导致数据不一致,或者操作达不到预期的效果。这个时候我们就需要锁来解决这些问题。当我们的线程很多的时候,就需要不断的加锁,释放锁,该操作就会消耗掉很多的时间;
如果想了解更多的知识,请查阅其他资料