本文翻译自国外论坛 medium,原文地址:levelup.gitconnected.com/4-reasons-w…
作为内存数据存储,Redis 以其速度和功能而闻名,一般被用作大多数后端服务的缓存解决方案。
然而,在 Redis 内部选用的也仅仅单线程的设计。
为什么 Redis 单线程设计会带来如此高的功能?假如运用多个线程并发处理恳求不是更好吗?
在本文中,我们将探讨使 Redis 成为快速高效的数据存储的设计挑选。
长话短说
Redis 的功能可归因于 4 个主要因素
- 根据内存存储
- 优化的数据结构
- 单线程架构
- 非堵塞IO
让我们一一分析一下。
推荐博主开源的 H5 商城项目waynboot-mall,这是一套全部开源的微商城项目,包含三个项目:运营后台、H5 商城前台和服务端接口。完成了商城所需的主页展示、产品分类、产品概况、产品 sku、分词搜索、购物车、结算下单、付出宝/微信付出、收单谈论以及完善的后台办理等一系列功能。 技术上根据最新得 Springboot3.0、jdk17,整合了 MySql、Redis、RabbitMQ、ElasticSearch 等常用中间件。分模块设计、简练易保护,欢迎我们点个 star、重视博主。
github 地址:github.com/wayn111/way…
根据内存存储
Redis 是在内存中进行键值存储。
Redis 中的每次读写操作都相当于从内存的变量中进行读写。
拜访内存比直接拜访磁盘快几个数量级,因此Redis 比其他数据存储快得多。
优化的数据结构
作为内存数据存储,Redis 运用各种底层数据结构来高效存储数据,无需忧虑如何将它们耐久化到耐久存储中。
例如,Redis list 是运用链表完成的,它答应在列表的头部和尾部邻近进行稳定时刻 O(1) 插入和删除。
另一方面,Redis sorted set 是通过跳动列表完成的,能够完成更快的查询和插入。
简而言之,无需忧虑数据耐久化,Redis 中的数据能够更高效地存储,以便通过不同的数据结构进行快速检索。
单线程
Redis 中的写入和读取速度非常快,并且 CPU 运用率历来不是 Redis 关心的问题。
根据 Redis 官方文档,在普通 Linux 体系上运行时,Redis 每秒最多能够处理 100 万个恳求。
一般瓶颈来自于网络 I/O, Redis 中的处理时刻大部分糟蹋在等候网络 I/O 上。
虽然多线程架构答应应用程序通过上下文切换并发处理任务,但这对 Redis 的功能增益很小,因为大多数线程最终会在 I/O 中被堵塞。
所以 Redis 选用单线程架构,有如下优点
- 最大极限地削减因为线程创建或销毁而产生的 CPU 耗费
- 最大极限地削减上下文切换造成的 CPU 耗费
- 削减锁开支,因为多线程应用程序需求锁来进行线程同步,而这容易出现过错
- 能够运用各种“线程不安全”指令,例如 Lpush
非堵塞I/O
为了处理传入的恳求,服务器需求在套接字上履行体系调用,以将数据从网络缓冲区读取到用户空间。
这一般是堵塞操作,线程被堵塞并且在彻底接收到来自客户端的数据之前不能履行任何操作。
为什么我们不能在只要确认套接字中的数据已准备好读取时,才履行体系调用嘞?
这就是 I/O 多路复用发挥作用的地方。
I/O 多路复用模块一起监视多个套接字,并且仅回来可读的套接字。
准备读取的套接字被推送到单线程事件循环,并由相应的处理程序运用响应式模型进行处理。
总之,
- 网络 I/O 速度很慢,因为其堵塞特性,
- Redis 收到指令后能够快速履行,因为这在内存中履行,操作速度很快,
所以 Redis 做出了以下决定,
- 运用 I/O 多路复用来缓解网络 I/O 缓慢问题
- 运用单线程架构削减锁开支
结论
综上所述,单线程架构是 Redis 团队通过深思熟虑的挑选,并且经受住了时刻的考验。
虽然是单线程,Redis 仍然是功能最高、最常用的内存数据存储之一。
重视大众号【waynblog】每周共享技术干货、开源项目、实战经验、高效开发工具等,您的重视将是我的更新动力!