👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

a5cee5e9ee92d1e7701abcfc2dd83b29.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:

  • Boot 地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 地址:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

来源:levelup.gitconnected.com/4-
reasons-why-single-threaded-redis
-is-so-fast-414e0106f921


作为内存数据存储,Redis 以其速度和性能而闻名,通常被用作大多数后端服务的缓存解决方案。

然而,在 Redis 内部采用的也只是单线程的设计。(虽然6.0引入多线程,但工作线程读写仍然使⽤单线程来处理)

为什么 Redis 单线程设计会带来如此高的性能?如果利用多个线程并发处理请求不是更好吗?

在本文中,我们将探讨使 Redis 成为快速高效的数据存储的设计选择。

长话短说

Redis 的性能可归因于 4 个主要因素

  • 基于内存存储

  • 优化的数据结构

  • 单线程架构

  • 非阻塞IO

让我们一一剖析一下。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

基于内存存储

f9eac2cb45ff39f4c01d34a69a23d3e5.jpeg
访问内存比访问磁盘快几个数量级

Redis 是在内存中进行键值存储。

Redis 中的每次读写操作都相当于从内存的变量中进行读写。

访问内存比直接访问磁盘快几个数量级,因此Redis 比其他数据存储快得多。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

优化的数据结构

e1ae2cd893a82e237a5e223dfc2ef95a.jpeg
redis底层数据结构

作为内存数据存储,Redis 利用各种底层数据结构来高效存储数据,无需担心如何将它们持久化到持久存储中。

例如,Redis list 是使用链表实现的,它允许在列表的头部和尾部附近进行恒定时间 O(1) 插入和删除。

另一方面,Redis sorted set 是通过跳跃列表实现的,可以实现更快的查询和插入。

简而言之,无需担心数据持久化,Redis 中的数据可以更高效地存储,以便通过不同的数据结构进行快速检索。

单线程

e249494de907d2500b6085be00111797.jpeg
单线程进程

Redis 中的写入和读取速度非常快,并且 CPU 使用率从来不是 Redis 关心的问题。

根据 Redis 官方文档,在普通 Linux 系统上运行时,Redis 每秒最多可以处理 100 万个请求。

通常瓶颈来自于网络 I/O, Redis 中的处理时间大部分浪费在等待网络 I/O 上。

虽然多线程架构允许应用程序通过上下文切换并发处理任务,但这对 Redis 的性能增益很小,因为大多数线程最终会在 I/O 中被阻塞。

所以 Redis 采用单线程架构,有如下好处

  • 最大限度地减少由于线程创建或销毁而产生的 CPU 消耗

  • 最大限度地减少上下文切换造成的 CPU 消耗

  • 减少锁开销,因为多线程应用程序需要锁来进行线程同步,而这容易出现错误

  • 能够使用各种“线程不安全”命令,例如 Lpush

非阻塞I/O

4eca51ae75911f35b72145df22f02835.jpeg
I/O 多路复用

为了处理传入的请求,服务器需要在套接字上执行系统调用,以将数据从网络缓冲区读取到用户空间。

这通常是阻塞操作,线程被阻塞并且在完全接收到来自客户端的数据之前不能执行任何操作。

为什么我们不能在只有确定套接字中的数据已准备好读取时,才执行系统调用嘞?

这就是 I/O 多路复用发挥作用的地方。

I/O 多路复用模块同时监视多个套接字,并且仅返回可读的套接字。

准备读取的套接字被推送到单线程事件循环,并由相应的处理程序使用响应式模型进行处理。

总之,

  • 网络 I/O 速度很慢,因为其阻塞特性,

  • Redis 收到命令后可以快速执行,因为这在内存中执行,操作速度很快,

所以 Redis 做出了以下决定,

  • 使用 I/O 多路复用来缓解网络 I/O 缓慢问题

  • 使用单线程架构减少锁开销

结论

1e4d319c1172391a6d752c412ffd326f.jpeg
四个原因

综上所述,单线程架构是 Redis 团队经过深思熟虑的选择,并且经受住了时间的考验。

尽管是单线程,Redis 仍然是性能最高、最常用的内存数据存储之一。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

53edafa6f518f8d6d310c7ce187c879a.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

e1024dc86f16830d4cc5510fce1cf802.png

b28807f8b2479225c65199ca3f91cb53.png85cca24946a717127d4f78537f271321.png266c0627973080955461394b1e7fc778.png4c52d2e1d512bbfd18cdef2093844707.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
Logo

数据库是今天社会发展不可缺少的重要技术,它可以把大量的信息进行有序的存储和管理,为企业的数据处理提供了强大的保障。

更多推荐