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

相关推荐
薛定猫AI2 小时前
【深度解析】终端里的免费 AI 编程助手 Freebuff:多代理架构、模型路由与安全使用实战
人工智能·安全·架构
candyTong8 小时前
Claude Code Agent Teams:多 Agent 协作的生命周期与实现机制
后端·架构
Mahir088 小时前
Redis 与 MySQL 数据同步:一致性保证的完整解决方案
数据库·redis·mysql·缓存·面试·数据一致性
2301_769340678 小时前
如何在 Vuetify 中可靠捕获 Chip 关闭事件(包括键盘触发).txt
jvm·数据库·python
AC赳赳老秦8 小时前
供应链专员提效:OpenClaw自动跟踪物流信息、更新库存数据,异常自动提醒
java·大数据·服务器·数据库·人工智能·自动化·openclaw
灵犀学长9 小时前
基于 Spring ThreadPoolTaskScheduler + CronTrigger 实现的动态定时任务调度系统
java·数据库·spring
北秋,9 小时前
PostgreSQL(Postgres)数据库基础用法 + 数字型 + 字符型 完整联合注入实战
数据库·postgresql·开源
m0_5967490910 小时前
JavaScript中手动实现一个new操作符的底层逻辑
jvm·数据库·python
多加点辣也没关系10 小时前
Redis 的安装(详细教程)
数据库·redis·缓存
数据库小学妹11 小时前
数据库连接池避坑指南:告别“连接超时”与“资源耗尽”,让系统跑得更快!
数据库·redis·sql·mysql·缓存·dba