アプリケーション開発において、データベースの選択はデータ検索のスピード、スケーラビリティ、そして全体的なパフォーマンスを左右します。MongoDBとRedisは、近年どちらも人気の高いデータベース管理システムです。

どちらもスケーラブルでオープンソースのNoSQLデータベースであり、使いやすさとスピードにおいては両者ほぼ互角と言えます。しかし、それぞれが得意とする要件や強みは異なります。

今回は、MongoDBとRedisの類似点と相違点を掘り下げていきます。あなたのプロジェクトにはどちらが適しているのか、この記事でその答えが見つかるはずです。

要件に応じたデータベース選び

アプリケーションには、それぞれ適したデータベースアーキテクチャがあります。つまり、MongoDBとRedisのどちらを使用するべきかは、アプリケーションの要件に依存します。両者の最も大きな違いはストレージモデルで、これはデータ検索速度、ストレージ容量、データ損失やクラッシュのリスクに影響します。

MongoDBはデフォルトで、データをバイナリJSON(BSON)ドキュメントのコレクションとしてディスク上に保存します。このオンディスクストレージは、ストレージ容量が大きく、システムクラッシュのリスクが少ないのが特徴です。BSONドキュメントとしてデータを保存することで、通常のJSONでは解析できない多くのデータ型に対応できるようになります。また、データをインメモリデータベースやクラウドに保存することも可能です。

さらに、MongoDBにはスキーマや固定されたデータ構造がないため、ドキュメント構造を作成する必要がありません。これによって初心者でも扱いやすく、大量のデータを高速処理することができます。

MongoDBはスケーラビリティにも優れ、水平方向と垂直方向のどちらにも伸縮自在です。この点から、その後の変化にも対応しやすく、潜在的な発展や成長が予想される新興企業などに理想的です。

しかし、急速に変化するデータを扱うプロジェクトであれば、Redisを使用するのが賢明です。様々なデータタイプをサポートするキーバリュー型でデータを保存するため、多用途性が高く、さらにメッセージブローカーやキャッシュとしても機能します。

MongoDBとは異なり、Redisはディスク上の永続性を持つインメモリストレージを使用しているため、RAM上で流入データをより高速に処理できます。このインメモリストレージは、ターゲティング広告、SNS分析、Apache Kafka、その他のストリーミングソリューションなどのリアルタイム分析に適しています。

データベースアーキテクチャ

データベースアーキテクチャは、データベース管理システム内でのデータの収集、保存、検索、拡張、統合のルールを定義します。データベースのパフォーマンスとスケーラビリティに影響するため、しっかりと理解しておきたいところです。

MongoDBはドキュメント指向のアーキテクチャと非構造化クエリ言語を採用しています。ドキュメントには柔軟なスキーマと構造があり、適宜フィールドを挿入、削除できます。階層構造や入れ子構造にも対応しています。

また、MongoDBはBSONを使用しているため、データストレージは一般的にSQLデータベースではサポートされていない、多くのファイルタイプに対応できます。しかし、データの複製率が高いため、ストレージ消費量が多くなります。また、外部キーと結合もありません。

一方のRedisは、キーとそれに割り当てられた値の2つの項目を含む、個別のコレクションにデータを保持するキーバリューストア(KVS)に大きく依存しています。Redisは、一意の識別子(キー)を使用して特定のデータを保存、取得します。これらのキーはディクショナリに格納され、複数の値を処理できるようにするためにパーサーが必要になります(デフォルトでは、各キーは単一の値しか格納できない)。

Redisは、ハッシュ、文字列、セット、リスト、セット、ソートされたセット、ストリーム、地理空間インデックス、ビットマップのようなデータ構造と値をサポートしています。しかしこれらのストレージは、RAM上で利用可能なストレージ容量によって制限され、保存されたデータは拡張性に欠けるというデメリットも。またアプリケーションが成長するにつれて徐々にアクセス面での不便さも感じるはずです。

MongoDBとRedisの主な違い

MongoDBとRedisの主な相違点と類似点を表にまとめてご紹介します。

MongoDB Redis
速度 スキーマレス構造により、大量のデータがディスク上に保存されていても高速。 大量のデータがインメモリストレージに保存されていない限り、MongoDBよりも圧倒的に高速。
スケーラビリティ 内蔵のシャーディングにより、複数のリージョンやノードにまたがってスケールアウトが可能。ハッシュシャード、レンジシャード、ゾーンシャード、およびクロスシャードなどの種類があり、一貫性のあるマルチクラウドバックアップには、MongoDB Atlasで簡単にアクセスできる。 すべてのコミュニティ、公式ドライバに多言語機能あり。 Redisクラスタでスケーラビリティを実現。シャーディングはハッシュ化のみ。シャードは手動での管理が必要。シャードのバックアップに一貫性がなく、ドライバのサポートが限定的。
トランザクションデータの整合性 マルチステートメント構文によるマルチドキュメント対応のACIDトランザクションをサポート。 マルチコマンドとマルチレコードトランザクションをサポート。 デフォルトのロールバック機能はなし。
メモリ使用 オンディスクストレージ。10万のアセットにつき約1GBのメモリを消費。 インメモリストレージ。約4GBのRAMが必要になり、MongoDBよりメモリ使用量が多い。
インデックス インデックスの作成は簡単かつ多様。 MongoDB AtlasのPerformance Advisorによって、インデックスの追加が推奨されることも。セカンダリインデックスは、さまざまな方法でデータを処理するアプリケーションの構築に使用できる。 セカンダリインデックスの構築は複雑で、手動でメンテナンスを行う必要がある。
高可用性 レプリケーションで高可用性を実現。 複数のノードやサービスセンターにまたがるプライマリ/セカンダリレプリケーションで高可用性を実現。
クエリ言語 MongoDB Query APIは、テキスト検索、範囲検索、単一または複数のキーでドキュメントにクエリを実行。取得したデータのマテリアライズドビューを(オンデマンドで)作成し、地理空間クエリやグラフトラバーサルを実行。 キーバリュークエリのみ。クエリ機能は劣るが、外部Redisモジュールで拡張可能。
永続ストレージ Kubernetesの永続ボリューム機能でデータ/ストレージの永続性を実現。 AOF(Append-Only File)およびスナップショットによる永続ストレージ。
データアグリゲーション 単一目的の集約、mapReduce()、集約パイプラインを使用。MongoDB Atlasが集約パイプラインビルダーを使用して集約パイプラインを構築、処理。 MapReduceと集約パイプラインを使用。

MongoDBとRedisの用途

どちらのデータベース管理システムを使用するかを決定する際は、両者の仕様を比較することが重要ですが、開発するアプリケーションの種類に最も依存します。

スピードと低レイテンシが鍵となるようなアプリであれば、Redisが答えでしょう。不正検知や最新のゲーム開発など、刻々と変化する大量のリアルタイムデータを迅速かつ効率的に処理する必要があるアプリケーションの負荷を処理できます。

一方のMongoDBは、スケーラビリティと信頼性に優れていることから、長期間にわたり大量のデータを保存するアプリケーションに理想的です。ECサイト、写真共有アプリ、福利厚生プログラムなどがその一例です。

KinstaのRedisアドオン

KinstaのRedisアドオンは、掲示板、会員制サイト、ECサイト、フォーラム、頻繁に更新するブログなど、ページキャッシュがあまり意味のない、高度に動的なウェブサイトに便利な永続オブジェクトキャッシュです。

WordPressのオブジェクトキャッシュによって生成された値を永続的に保存することで、MySQLデータベースに同じオブジェクトを二度(あるいはそれ以上)問い合わせる代わりに、キャッシュされたオブジェクトを再利用できるようになります。そして最終的には、トラフィックの処理能力を向上し、サイトの応答時間とMySQLデータベースへの負荷を軽減します。

まとめ

MongoDBとRedisは、どちらも優れたデータベース管理システムです。ストレージ、モデル、アーキテクチャ、そして機能の違いは、プロジェクト固有の要件によって適切な選択肢が異なることを意味します。

MongoDBは安定していて信頼性が高く、汎用的なプロジェクトにうってつけ。しかし、オンディスクストレージモデルのため、リアルタイムのデータ処理は比較的遅くなります。

一方、Redisはインメモリストレージであるため、大量のリアルタイムデータの処理に適しています。その反面、拡張性には欠け、経験の浅い開発者が使用するには、難易度が高くなります。

KinstaのRedisアドオンを使えば、複雑な管理業務を省き、プロジェクトにRedisをスムーズに統合できます。他の業務に専念できるようになることで、生産性も向上。超高速ストレージのRedisアドオン、そしてKinstaのデータベースホスティングをぜひお試しください。

Jeremy Holcombe Kinsta

Content & Marketing Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems ;).