01 Redis
Redisは、リモートインメモリデータベースであり、強力なパフォーマンスだけでなく、問題を解決するためのレプリケーション特性と独自のデータモデルも備えています。Redisには5種類のデータ構造があり、さまざまな問題をこれらのデータ構造に自然にマッピングできます。レプリケーション、永続化、クライアント側のシャーディング、その他の機能により、ユーザーはRedisを数百GBのデータを含むシステムに簡単に拡張し、1秒あたり数百万のリクエストを処理できます。
1.1 Redisの概要
Redisは非常に高速な非リレーショナルデータベース(非リレーショナルデータベース)であり、キーと5種類の値の間のマッピングを保存できます。また、メモリに保存されたキーを保存できます。値のペアのデータはハードディスクに保持され、機能をコピーして読み取りパフォーマンスを拡張でき、クライアント側のシャーディングを使用して書き込みパフォーマンスを拡張することもできます。
Redisと他のデータベースまたはソフトウェアの比較
リレーショナルデータベース内の2つのテーブルの関連付けと比較して、Redisはテーブルを使用せず、データベースはユーザーに事前定義したり、Redis内の異なるデータを関連付けることを強制したりしません。
高性能のKey-ValueキャッシュサーバーmemcachedはしばしばRedisと比較されます。
- これらはどちらもキーと値のマップを格納するために使用でき、パフォーマンスはほぼ同じです。
- ただし、Redisは自動的に2つの異なる方法でデータをディスクに書き込むことができます。
- 通常の文字列キーの保存に加えて、Redisは他の4つのデータ構造も保存できますが、memcachedは通常の文字列キーのみを保存できます。
これらの違いにより、Redisを使用して幅広い問題を解決でき、プライマリデータベース(プライマリデータベース)としても、他のストレージシステムの補助データベース(補助データベース)としても使用できます。
一般に、多くのユーザーはRedisのパフォーマンスまたは機能が必要な場合にのみRedisを使用します。読者は、自分のニーズに応じてRedisを使用するかどうかを決定し、Redisをプライマリストレージまたは補助ストレージとして使用するかどうか、およびレプリケーション、永続性、トランザクションなどの手段を通じてデータの整合性を確保する方法を検討する必要があります。
名前 | タイプ | データ保存オプション | クエリの種類 | 追加機能 |
---|---|---|---|---|
Redis | インメモリを使用した非リレーショナルデータベース | 文字列、リスト、コレクション、ハッシュテーブル、順序付きコレクション | 各タイプには、一括操作(部分操作)と部分(部分)トランザクションのサポートに加えて、独自の排他コマンドがあります。 | パブリッシュおよびサブスクライブ、マスター/スレーブレプリケーション(マスター/スレーブレプリケーション)、永続化、スクリプト(ストアドプロシージャ、ストアドプロシージャ) |
Memcached | メモリストレージを使用したキーと値のキャッシュ | キーと値のマッピング | コマンドの作成、コマンドの読み取り、コマンドの更新、コマンドの削除、およびその他のいくつかのコマンド | パフォーマンスを向上させるマルチスレッドサーバー |
Mysql | リレーショナルデータベース | 各データベースには複数のデータテーブルを含めることができ、各テーブルには複数の行を含めることができます。複数のテーブルのビューを処理できます。スペースとサードパーティの拡張をサポートします | SELECT、UPDATE、INSERT、DELETE、関数、ストアドプロシージャ | ACIDネイチャー(InnoDBが必要)、マスタースレーブレプリケーション、マスターマスターレプリケーションをサポート |
MongoDB | オンディスクストレージを使用した非リレーショナルドキュメントストレージ | 各データベースには複数のテーブルを含めることができ、各テーブルにはスキーマのない複数のBSONドキュメントを含めることができます | コマンドの作成、読み取りコマンド、更新コマンド、削除コマンド、条件付きクエリコマンドなど。 | map-reduce操作、マスタースレーブレプリケーション、シャーディング、空間インデックスをサポート |
追加機能
持久化:
Redisのようなインメモリデータベースを使用する場合、最初に考慮すべき問題の1つは、「サーバーがシャットダウンしたときにサーバーに格納されたデータがどこに移動するか」です。
Redisには2つの異なる永続化方法があり、メモリに格納されたデータを小さくコンパクトな形式でハードディスクに書き込むことができます。
最初のタイプはポイントインタイムダンプです。ダンプ操作は、「指定された時間内に指定された数の書き込み操作が実行される」という条件が満たされたときに実行できます。実行するダンプされたハードディスクコマンドのいずれか。
2番目の永続化方法では、変更されたすべてのデータベースコマンドを追加専用ファイルに書き込みます。ユーザーは、データの重要度に応じて、同期しない、毎秒1回の同期、または毎回書き込むように追加のみの書き込みを設定できます。コマンドを入力するときに一度同期します。
マスタースレーブレプリケーション:
さらに、Redisのパフォーマンスは良好ですが、メモリストレージの設計によって制限され、Redisサーバーがすべてのリクエストを処理できない場合があります。Redisの読み取りパフォーマンスを拡張し、Redisのフェイルオーバーサポートを提供するために、Redisはマスター/スレーブレプリケーションの機能を実装しています。
マスタースレーブレプリケーション:レプリケーションを実行するスレーブサーバーはマスターサーバーに接続し、マスターサーバーから送信されたデータベース全体のコピーを受け入れます。その後、マスターサーバーによって実行された書き込みコマンドは、接続されているすべてのスレーブサーバーに送信されて実行され、リアルタイムで更新されます。サーバーのデータセット。スレーブサーバーに含まれるデータは継続的に更新されるため、クライアントはマスターサーバーへの集中的なアクセスを回避するために、任意のスレーブサーバーに読み取り要求を送信できます。
Redisを使用する理由
- 要素を削除するためにMemcachedで採用された方法は、ブラックリストメカニズム(ブラックリスト)を通じてリスト内の要素を非表示にすることで、要素の読み取り、更新、書き込みの操作を回避します。逆に、Redis LISTとSETでは、ユーザーが直接追加または要素を削除します。
- Redisを使用すると、コードがより簡潔で理解しやすくなり、保守が容易になるだけでなく、コードの実行速度も向上します(ユーザーがデータベースを読み取ってデータを更新する必要がないため)。さらに、Redisはリレーショナルデータベースよりもはるかに効率的で使いやすいです。
- データベースは、テーブルの行を更新するための非常に遅い操作です。ランダムな読み取りが発生するだけでなく、ランダムな書き込みも発生します。Redisでは、ユーザーはアトミックINCRコマンドとそのバリアントを直接使用して集計データを計算できます。これは、Redisがデータをメモリに保存し、Redisコマンドに送信されたリクエストが従来のクエリアナライザーとクエリオプティマイザーを経由する必要がないためです。処理なので、Redisによって保存されたデータに対してランダムな書き込みを実行する速度は非常に高速です。
- さらに、Redisはリレーショナルデータベースやその他のハードディスクストレージデータベースではないため、不要な一時データの書き込みを回避でき、一時データのスキャンや削除の問題を回避でき、最終的にプログラムのパフォーマンスを向上できます。
1.2 Redisデータ構造の概要
Redisは、キーと5つの異なるデータ構造タイプ(文字列、リスト、セット、ハッシュ、zset)の間のマッピングを保存できます。del、type、renameなど、一部のコマンドはこれら5つのデータ構造に共通ですが、1つまたは2つの構造に対してのみ使用できるRedisコマンドもあります。
構造タイプ | 構造格納値 | 構造リテラシー |
---|---|---|
ストリング | 文字列、整数、浮動小数点 | 文字列全体または文字列の一部に対して演算を実行し、整数および浮動小数点数に対してインクリメントまたはデクリメント演算を実行します |
リスト | リンクリスト。リンクリストの各ノードには文字列が含まれています | リンクリストの両端から要素をプッシュまたはポップする、オフセットに従ってリンクリストをトリミングする、単一または複数の要素を読み取る、値に基づいて要素を検索または削除する |
セットする | 文字列を含む順不同のコレクター。含まれる各文字列は一意であり、異なる | 個々の要素を追加、取得、および削除し、要素がセットに存在するかどうかを確認し、交差、和集合、および差を計算します。コレクションからランダムに要素を取得する |
ハッシュ | キーと値のペアを含む順不同のハッシュテーブル | 1つのキーと値のペアを追加、取得、削除し、すべてのキーと値のペアを取得します |
トークン | 文字列メンバーと浮動小数点スコア間の順序付けられたマッピング、要素の順序はスコアサイズによって決定されます | 個々の要素を追加、取得、および削除し、スコアの範囲またはメンバーに基づいて要素を取得します |
注:
- 以下は、Dockerによって構築された単純なRedis環境を使用し、単純なコマンド操作にはredis-cliを使用します。Dockerの起動Redisプロセスは、この記事の最後にある付録に示されています。
- 以下は、5つのデータ構造の最も単純な操作です。
Redisの文字列
コマンド | 振る舞い |
---|---|
取得する | キーに格納されている値を取得する |
セットする | キーに格納されている値を設定します |
の | 指定されたキーに格納されている値を削除します |
Redisのリスト
リスト構造は、複数の文字列を順番に格納できます。
コマンド | 振る舞い |
---|---|
rpush | 指定された値をリストの右端にプッシュすると、コマンドはリストの現在の長さを返します |
オレンジ | 指定された範囲内のリストのすべての値を取得します。すべての要素を抽出するには、開始インデックスとして0を、終了インデックスとして-1を使用します |
lindex | インデックスに従って単一の要素を抽出します |
lpop | リストの左端から値をポップし、ポップした値を返します |
レディスを舞台とする作品
Redisのコレクションとリストはどちらも複数の文字列を格納できます。これらの違いは、リストは複数の同一の文字列を格納できるのに対し、コレクションはハッシュテーブルを使用して、格納する各文字列が異なることを確認します。同じです(これらのハッシュテーブルにはキーのみがあり、キーに関連付けられた値はありません)。
コマンド | 振る舞い |
---|---|
悲しい | 指定した要素をコレクションに追加します |
メンバー | コレクションに含まれるすべての要素を返します |
姉妹 | 指定した値がコレクションに存在するかどうかを確認します |
srem | 指定された要素がコレクションに存在する場合、要素を削除します |
基本的な追加および削除操作に加えて、setは、sinter、sunlight、sdiffなどの他の多くの操作もサポートします。これらの3つのコマンドは、それぞれ交差操作、結合操作、および差分操作を実行できます。
基本的な操作:
Redisのハッシュテーブルハッシュ
Redisハッシュは、複数のキーと値のペア間のマッピングを保存できます。ハッシュに格納される値は文字列または数値であり、ユーザーは数値をインクリメントおよびデクリメントすることもできます。
ハッシュは多くの点でRedisのミニチュアバージョンに似ています。
コマンド | 振る舞い |
---|---|
hget | 指定されたハッシュキーの値を取得します |
hset | 指定されたキーと値のペアをハッシュに関連付ける |
hgetall | ハッシュに含まれるすべてのキーと値のペアを取得する |
hdel | 指定されたキーがハッシュに存在する場合は、キーを削除します |
基本的な操作:
Redisの順序付きコレクションzset
順序付きハッシュと同様に、順序付きセットはキーと値のペアを格納するために使用されます。
順序付きセットのキーはメンバー(メンバー)と呼ばれ、各メンバーは異なります。
順序付けられたセットの値はスコアと呼ばれ、スコアは浮動小数点数でなければなりません。
順序付けられたコレクションは、メンバーに基づいて要素にアクセスできるRedisの唯一の構造であり、スコアとスコアが配置された順序に基づいて要素にアクセスすることもできます。
コマンド | 振る舞い |
---|---|
ザッド | 指定されたスコアを持つメンバーを順序付けられたコレクションに追加します |
zrange | 順序付きセット内の要素の位置に従って、順序付きセットから複数の要素を取得します |
zrangebyscore | 指定されたスコア内の順序付けられたコレクションのすべての要素を取得します |
ズレム | 指定されたメンバーが順序付きセットに存在する場合、メンバーを削除します |
基本的な操作:
1.3簡単なまとめ
Redisは、問題の解決に使用できるツールです。、他のデータベースにはないデータ構造、およびメモリストレージ(Redisを非常に高速にする)、リモート(Redisが複数のクライアントおよびサーバーと接続できるようにする)、および永続性(サーバーを作成する)の両方を備えています再起動後、再起動前のデータ)とスケーラビリティ(マスタースレーブレプリケーションとシャーディングによる)およびその他の機能が維持されるため、ユーザーはさまざまな問題に対するソリューションをおなじみの方法で構築できます。
考え方の変化:
「どのようにして自分のアイデアをデータベースのテーブルと行に詰め込むことができますか」は次のように変わります。