⭐️前言⭐️
本小节主要围绕Redis的单线程模型展开
🍉欢迎点赞 👍 收藏 ⭐留言评论
🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言
🍉博客中涉及源码及博主日常练习代码均已上传GitHub
📍内容导读📍
- 🍅单线程架构
- 🍅1.引出单线程模型
- 🍅2.为什么单线程还能这么快?
- 🍅3.弊端
🍅单线程架构
Redis使用了单线程架构来实现高性能的内存数据库服务,本小节首先通过多个客户端命令调用的例子说明Redis单线程命令处理机制,接着分析Redis单线程模型为什么性能如此之高,最终给出为什么理解单线程模型是使用和运维Redis的关键。
🍅1.引出单线程模型
现在开启三个 redis-cli
客户端同时执⾏命令
在宏观角度上,三个客户端看起来是“并发”要求Redis去执行命令的,如下图所示:
但在微观角度,这些命令还是采用线性方式去执行的,只是原则上命令的执行顺序是不确定的,但一定不会有两条命令被同步执行,如下图所示:
所以也就是说,当多个请求同时到达Redis服务器,也是要在队列中排队,再等待redis服务器一个一个的取出里面的命令再去执行,微观上讲,redis服务器是串行/顺序执行这多个命令的,如下图所示模型:
🍅2.为什么单线程还能这么快?
这里的快,是相对于比如MySQL、Oracle之类的关系型数据库来讲的
通常来讲,单线程处理能力要比多线程差,那么为什么Redis使用单线程模型会达到每秒万级别的处理能力呢?可以将其归结于以下几点:
a. Redis访问内存,数据库则是访问硬盘
b. Redis的核心功能,比数据库的核心功能更简单
数据库对于数据的增删改查,都有更复杂的功能支持,这样的功能势必要花费更多的开销;而Redis干的活少,提供的功能相比于MySQL也是少了很多
c. Redis的单线程模型,避免了一些不必要的线程竞争开销
Redis的每个基本操作,都是短平快的,就是简单操作一下内存数据,不是什么特别消耗CPU的操作
d. Redis在处理网络IO的时候,使用了epoll这样的IO多路复用机制
IO多路复用机制,就是通过一个线程来管理多个socket;
针对TCP来说,服务器这边每次要服务一个客户端,都需要一个socket,一个服务器服务多个客户端,同时就有很多个socket,但是在同一时刻,只有少数socket是活跃的;所以就可以让一个线程来同时管理多个事情,前提是这几件事的交互不频繁,大部分时间都在等
就像我们去食堂买饭,如果想吃三个窗口的东西,我们只需要买了以后去买另一个东西,有一种东西做好了,窗口老板喊我一嗓子去拿就可以。
🍅3.弊端
虽然单线程给Redis带来很多好处,但还是有一个致命的问题:对于单个命令的执行时间都是有要求的。如果某个命令执行过长,会导致其他命令全部处于等待队列中,迟迟等不到响应,造成客户端的阻塞,对于Redis这种高性能服务来说是非常严重的,所以Redis是面向快速执行场景的数据库。
⭐️最后的话⭐️
总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正😁