この記事は海外のフォーラム媒体から翻訳されたもので、元のアドレスはlevelup.gitconnected.com/4-reasons-w…
Redis は、インメモリ データ ストアとしての速度とパフォーマンスで知られており、ほとんどのバックエンド サービスのキャッシュ ソリューションとしてよく使用されます。
ただし、Redis 内ではシングルスレッド設計のみが使用されます。
Redis のシングルスレッド設計がこれほど高いパフォーマンスをもたらすのはなぜですか? リクエストを同時に処理するには複数のスレッドを使用した方がよいのではないでしょうか?
この記事では、Redis を高速で効率的なデータ ストアにするための設計上の選択について説明します。
長い話短い
Redis のパフォーマンスは 4 つの主な要因に起因すると考えられます
- メモリベースのストレージ
- 最適化されたデータ構造
- シングルスレッドアーキテクチャ
- ノンブロッキングIO
それらを一つずつ分析してみましょう。
ブロガーのオープン ソース H5 モール プロジェクトwaynboot-mallを推奨します。これは、運営バックグラウンド、H5 モール フロント デスク、サーバー インターフェイスの 3 つのプロジェクトを含む、すべてのオープン ソース マイクロ モール プロジェクトのセットです。ホームページ表示、商品分類、商品詳細、商品sku、単語分割検索、ショッピングカート、決済・発注、Alipay/WeChat決済、領収書コメント、完璧なバックグラウンド管理などの一連の機能を実現します。技術的には最新の Springboot3.0 と jdk17 に基づいており、MySql、Redis、RabbitMQ、ElasticSearch などの一般的なミドルウェアが統合されています。サブモジュールのデザインはシンプルでメンテナンスが簡単です。皆さんも星をクリックしてブロガーに注目してください。
github アドレス: github.com/wayn111/way…
メモリベースのストレージ
Redis はメモリ内のキーと値のストアです。
Redis でのすべての読み取りおよび書き込み操作は、メモリ内の変数からの読み取りおよび書き込みと同等です。
メモリへのアクセスは、ディスクに直接アクセスするよりも桁違いに高速であるため、Redis は他のデータ ストアよりもはるかに高速です。
最適化されたデータ構造
インメモリ データ ストアとして、Redis はさまざまな基礎となるデータ構造を利用して、データを永続ストレージに永続化する方法を気にすることなく効率的にデータを保存します。
たとえば、Redis リストはリンク リストを使用して実装されており、リストの先頭と末尾付近で定数時間の 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】にご注目いただき、技術乾物、オープンソースプロジェクト、実践経験、効率的な開発ツールなどを毎週シェアしていきますので、ご注目いただければ更新のモチベーションになります!