为什么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时,由于需要进行物理移动(例如磁盘旋转等),所以时间更长。

undefined

系统设计:为什么单线程的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を採用しており、シングルスレッドで複数リクエストに対応している

由于这个原因可以说它以单线程快速运行。

广告
将在 10 秒后关闭
bannerAds