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

相关推荐
m0_674031431 小时前
Spring boot启动原理及相关组件
数据库·spring boot·后端
m0_748255651 小时前
Linux环境下的事件驱动力量:探索Libevent的高性能IO架构
linux·架构·php
我科绝伦(Huanhuan Zhou)1 小时前
MySQL万能备份脚本
数据库·mysql
xiaowu0801 小时前
LiteDB 使用教程
数据库·oracle
努力成为DBA的小王1 小时前
Oracle(windows安装遇到的ORA-12545、ORA-12154、ORA-12541、ORA-12514等问题)
linux·运维·服务器·数据库·oracle
m0_748230211 小时前
Text2Sql:开启自然语言与数据库交互新时代(3030)
数据库·oracle·性能优化
NiNg_1_2341 小时前
Redis - 全局ID生成器 RedisIdWorker
数据库·redis·缓存
web_132334214361 小时前
MySQL FIND_IN_SET 函数详解
数据库·mysql·adb
xxxmine1 小时前
Mybatis之常用动态Sql语句
数据库·sql·mybatis
又是被bug折磨的一天2 小时前
有用的sql链接
数据库·sql