Redis单线程架构

⭐️前言⭐️

本小节主要围绕Redis的单线程模型展开

🍉欢迎点赞 👍 收藏留言评论

🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言

🍉博客中涉及源码及博主日常练习代码均已上传GitHub


📍内容导读📍

🍅单线程架构

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!!如有问题,欢迎评论区批评指正😁

相关推荐
友友马几秒前
『QT』窗口 (一)
开发语言·数据库·qt
q***78372 分钟前
SQL实现md5加密方法
数据库·sql
q***614113 分钟前
Spring中Aware的用法以及实现
java·数据库·spring
红树林0722 分钟前
渗透测试之sql注入--报错注入
数据库·sql·安全·web安全
菜鸟小九1 小时前
mysql(锁)
数据库·mysql·oracle
c***42101 小时前
【Sql Server】随机查询一条表记录,并重重温回顾下自定义函数的封装和使用
数据库·性能优化
q***44812 小时前
PostgreSQL的备份方式
数据库·postgresql
v***59832 小时前
【SQL Server】超详细SQLServer日期转换、字符串、数学、聚合等常用函数大全(最新版)
数据库·sqlserver
q***23572 小时前
python的sql解析库-sqlparse
数据库·python·sql
q***92512 小时前
sql实战解析-sum()over(partition by xx order by xx)
数据库·sql