为什么Redis能够以单线程高速运行?
总结
我最近在CodeCrafters这个服务中使用Golang开发了Redis。
其中,需要接受多个客户端的访问,可以选择单线程事件循环或多线程并行处理作为解决方案。
从简单的角度来看,并行处理似乎更有利于处理大量的访问,但 Redis 的原版却是单线程运行的。
据实际情况,似乎可以每秒处理100万个请求。
使用正在运行的平均Linux系统的Pipeline Redis,可以每秒传递100万个请求。
因为我对Redis为什么采用单线程并且能够快速运行感到好奇,所以我进行了调查。
Redis 是什么
这是一个内存中的键值数据存储。Redis服务器采用客户端/服务器模型,接收、处理并返回客户端请求,可以处理多个客户端的请求。
Redis选择单线程的原因。
改善可能な最も重要な要素はネットワークI/Oであり、CPUではありません。因此,与其寄望于多线程带来的性能改善,更重要的是解决网络I/O的瓶颈。
-
- スレッドの生成と破棄によるオーバーヘッド
- スレッドのスケジューリングに関するオーバーヘッド
考虑到抑制它的好处很大。
为什么Redis能够在单线程下快速运行?
可以列举以下三个理由。
1. 内存中
Redis使用RAM(Random Access Memory)。
RAM擅长对数据进行随机访问,并能迅速找到所需数据。
在处理磁盘的I/O时,通常会使用顺序访问。顺序访问会按顺序读取整个磁盘,因此到达所需的数据需要花费一定的时间。特别是在使用HDD时,由于需要进行物理移动(例如磁盘旋转等),所以时间更长。
系统设计:为什么单线程的Redis如此快速?
2. 数据结构已经被优化
Redis支持List、Set和Hash等多种数据类型,并且通过对它们的访问操作实现了O(1)的效率。这意味着无论输入的大小如何,处理时间始终保持不变。
例如,Redis的list是通过链表来实现的。这意味着无论list中有多少元素,向list的头部或尾部添加元素的速度都是相同的。
数据类型中包含了对每种数据结构的说明。
非阻塞式I/O
Redis采用了非阻塞的I/O机制,因为它是单线程运行的,这样可以同时处理多个请求。非阻塞的I/O机制指的是在I/O处理完成之前可以继续处理其他请求的机制。
通过与Redis使用的事件循环结合,可以避免C10K问题。
操作 Redis 客户端
整理
Redis是一个开源的高性能键值对数据库。
-
- インメモリであるためデータのI/Oが高速である
-
- データ構造が最適化されており多くの処理の計算量はO(1)である
- ノンブロッキングI/Oを採用しており、シングルスレッドで複数リクエストに対応している
由于这个原因可以说它以单线程快速运行。