パワーノード Redis7 ノート - 第 3 章 Redis コマンド

3 Redis コマンド

Redisは、コマンドで操作する対象に応じて、Redis上の基本操作を行うコマンド、Key操作を行うコマンド、Value操作を行うコマンドの3つに分類できます。

3.1 Redisの基本コマンド

まず、redis-cli コマンドを使用して Redis コマンド ライン クライアントに入り、次のコマンドを実行します。

3.1.1 ハートビートコマンドのping

ping コマンドを入力すると、PONG 応答が表示されます。これは、クライアントと Redis 間の接続が正常であることを意味します。このコマンドはハートビート コマンドとも呼ばれます。

3.1.2 キーと値の読み取りおよび書き込みコマンド

set key value は、指定されたキーと値を DB に書き込みます。get key は、指定されたキーの値を読み取ります。set および get コマンドの形式については、後ほど詳しく説明します。

3.1.3 DB切替セレクト

Redis にはデフォルトで 16 のデータベースがあります。これは、Redis Desktop Manager (RDM) グラフィカル クライアントで視覚的に確認できます。

デフォルトではDB No.0が使用され、dbインデックスを選択することでDBを切り替えることができます。たとえば、次のコマンドは DB3 に切り替え、age-23 を DB3 に書き込みます。

そして、この結果は RDM で直感的に確認できます。

3.1.4 キー数の確認 dbsize

dbsize コマンドは、現在のデータベース内のキーの数を表示できます。

上記の検査から、DB0 には 2 つのキーがあり、DB1 にはキーがなく、DB3 には 1 つのキーがあります。

3.1.5 現在のデータベースのデータflushdbを削除する

lushdb コマンドは現在のデータベース内のデータのみを削除し、他のデータベースには影響しません。

3.1.6 データベース内のすべてのデータを削除するコマンドflushall

flashall コマンドは、すべてのライブラリ内のすべてのデータを削除できます。したがって、このコマンドは注意して使用してください。

3.1.7 クライアント終了コマンド

exit または quit コマンドを使用して、Redis コマンド ライン クライアントを終了します。

3.2 キー操作コマンド

Redis に格納されるデータは全体として Map であり、キーは String 型、値は String、ハッシュ テーブル、List、Set などの型になります。

3.2.1 キー

  • フォーマット: KEYSパターン
  • 機能: 指定されたパターン pattern に一致するすべてのキーを検索します。パターンは正規表現です。
  • 注: KEYS は非常に高速ですが、大規模なデータベースで使用すると、現在のサーバーのサービスがブロックされる可能性があります。したがって、このコマンドは通常、運用環境では使用されず、代わりに scan コマンドが使用されます。

3.2.2は存在します

  • 形式: EXISTS キー
  • 機能: 指定されたキーが存在するかどうかを確認します。
  • 説明: キーが存在する場合は 1 を返し、存在しない場合は 0 を返します。

3.2.3の

  • 形式: DEL キー [キー ...]
  • 機能: 1 つ以上の指定されたキーを削除します。存在しないキーは無視されます。
  • 説明: 削除されたキーの数を返します。

3.2.4 名前の変更

  • 形式: RENAME キー newkey
  • 機能: キーの名前を newkey に変更します。
  • 説明: キーが newkey と同じである場合、またはキーが存在しない場合は、エラーが返されます。newkey がすでに存在する場合、RENAME コマンドは古い値を上書きします。名前の変更が成功すると OK を求めるプロンプトが表示され、失敗するとエラーが返されます。

3.2.5 移動

  • 形式: MOVE キー データベース
  • 機能: 現在のデータベースのキーを指定されたデータベース db に移動します。
  • 説明: 現在のデータベース (ソース データベース) と指定されたデータベース (ターゲット データベース) に同じ名前の指定されたキーがある場合、またはそのキーが現在のデータベースに存在しない場合、MOVE は効果がありません。移動が成功した場合は 1 を返し、失敗した場合は 0 を返します。

3.2.6型

  • 形式:TYPEキー
  • 機能: キーに格納されている値の型を返します。
  • 説明: 戻り値には以下の6種類があります
  • なし (キーが存在しません)
  • 文字列 (文字列)
  • リスト(リスト)
  • セット(コレクション)
  • zset (順序セット)
  • ハッシュ (ハッシュテーブル)

3.2.7 期限切れと期限切れ

  • 形式: EXPIRE キーの秒数
  • 機能: 特定のキーの有効期間を設定します。キーの有効期限が切れると (有効期間が 0 になると)、キーは自動的に削除されます。Expire の時間単位は秒で、pexpire の時間単位はミリ秒です。Redis では、有効期限のあるキーは「揮発性」であると言われます。
  • 説明: 生存時間が正常に設定された場合は 1 を返します。キーが存在しない場合は 0 を返します。名前変更操作によってキーの有効期間は変更されません。

3.2.8 ttlとpttl

  • 形式: TTL キー
  • 機能: TTL (生存時間) は、指定されたキーの残りの生存時間を返します。
  • 注: 考えられる戻り値は 3 つあります。
  • キーが存在しない場合は -2 を返します。
  • キーは存在するが、残りの有効期間が設定されていない場合は、-1 を返します。
  • それ以外の場合は、キーの残りの有効期間を返します。ttl コマンドで返される時間の単位は秒で、pttl コマンドで返される時間の単位はミリ秒です。

3.2.9 永続化

  • 形式: PERSISTキー
  • 機能: 指定されたキーの有効期間を削除し、このキーを「揮発性」から「永続的」に変換します。
  • 注: 有効期間が正常に削除された場合は 1 が返され、キーが存在しないかキーに有効期間が設定されていない場合は 0 が返されます。

3.2.10 ランダムキー

  • フォーマット: ランダムキー
  • 機能: 現在のデータベースからキーをランダムに返します (削除しません)。
  • 説明: データベースが空でない場合は、キーを返します。データベースが空の場合は nil を返します。

3.2.11 スキャン

  • 格式:SCANカーソル [MATCHパターン] [COUNT数] [TYPEタイプ]
  • 機能: データベース内のデータベース キーを反復処理するために使用されます。各オプションの意味は次のとおりです。
  • カーソル: この反復の開始時のカーソル。
  • pattern : この反復で照合されるキーのパターン。
  • count : この反復でデータセットから返す要素の数。デフォルト値は 10 です。
  • type: この反復で返される値のタイプ。デフォルトはすべてのタイプです。

SCAN コマンドはカーソルベースの反復子です。SCAN コマンドが呼び出されるたびに、2 つの要素を含む配列がユーザーに返されます。最初の要素は次の反復のための新しいカーソルであり、2 番目の要素は配列です。 、反復されるすべての要素が含まれます。ユーザーは、前の反復プロセスを継続するために、次の反復でこの新しいカーソルを SCAN コマンドのカーソル パラメーターとして使用する必要があります。SCAN コマンドのカーソル パラメータが 0 に設定されると、サーバーは新しい反復を開始します。新しいカーソルが 0 を返した場合、反復は終了です。

  • 説明: 断続的、負の、範囲外、またはその他の異常なカーソルを使用した増分反復では、サーバーはクラッシュしません。

データ量が多い場合、回数の指定が機能しない場合があり、Redis がその都度自動的に走査回数を調整します。scan コマンドは実行されるたびに少数の要素しか返さないため、このコマンドは KEYS コマンドによって引き起こされるサーバーのブロックの問題を発生せずに運用環境で使用できます。
増分反復コマンドで使用されるアルゴリズムは、データ セットのサイズが制限されたときに反復が停止することのみを保証します。つまり、反復データ セットのサイズが増大し続ける場合、増分反復コマンドは決して停止しない可能性があります。完全な反復を完了します。つまり、データ セットがますます大きくなるにつれて、データ セット内のすべての要素にアクセスするには、より多くの作業を行う必要があります。反復を終了できるかどうかは、ユーザーが反復を実行する速度が速いかどうかによって決まります。データセットが増大する速度よりも速い。

  • 関連コマンド: さらに、3 種類の値を走査するための 3 つのスキャン コマンドがあります。
    - hscan: ハッシュ タイプの値操作コマンドのセットに属し、現在のデータベース内の指定されたハッシュ テーブルのすべてのフィールドと値のペアを走査するために使用されます。
    - sscan: Set-type Value 操作コマンドのセットに属し、現在の DB 内の指定されたセットのすべての要素を走査するために使用されます。 - zscan :
    ZSet-type Value 操作コマンドのセットに属し、データベースのすべての要素を走査するために使用されます。現在の DB で指定された順序付きセット (値と要素の値)

3.3 文字列値操作コマンド

Redis に保存されたデータの値は、文字列型データにすることができます。String 型の値は、Redis で最も基本的で一般的な型です。数値またはバイナリ画像、オーディオ、ビデオ、シリアル化されたオブジェクトなど、あらゆるデータを文字列型の値に保存できます。String 型の値の最大サイズは 512M です。

3.3.1セット

  • 格式:SET キー値 [EX 秒 | PX ミリ秒] [NX|XX]
  • 機能: キーの値を値として直接設定することに加えて、SET ではいくつかのパラメーターを指定することもできます。
    • EX 秒: 現在のキーの有効期限を秒単位で設定します。SETEX コマンドと同等です。
    • PX ミリ秒: 現在のキーの有効期限をミリ秒単位で設定します。PSETEX コマンドと同等です。
    • NX: 指定されたキーが存在しない場合は、正常に設定され、指定されたキーを追加するために使用されます。SETNXコマンドと同等。
    • XX: 指定されたキーは正常に設定されるために存在する必要があり、指定されたキーの値を更新するために使用されます。
  • 注: 値の文字列にスペースが含まれる場合、文字列を二重引用符または一重引用符で囲む必要があります。そうしないと、set コマンドのパラメーターの数が正しくないとみなされ、エラーが報告されます。

3.3.2 setex と psetex

  • 形式: SETEX/PSETEX キーの秒値
  • 機能: 有効期限を設定します。キーの値を指定するだけでなく、キーの生存期間も設定します。setex の単位は秒、psetex の単位はミリ秒です。
  • 説明: キーがすでに存在する場合、古い値は上書きされます。このコマンドは、次の 2 つのコマンドに似ています。違いは、SETEX がアトミック操作であり、値の関連付けと有効期間の設定という 2 つのアクションが同時に完了することです。このコマンドは、Redis を次の 2 つのコマンドとして使用する場合に非常に実用的です。キャッシュ。

SET キーの値
EXPIRE キーの秒数 # 生存時間を設定します

3.3.3 設定

  • 形式: SETNX キー値
  • 機能: SET if Not eXists、キーが存在しない場合にのみ、キーの値を value に設定します。指定されたキーがすでに存在する場合、SETNX は何も行いません。成功した場合は 1 を返し、そうでない場合は 0 を返します。
  • 説明: このコマンドは、キー値 nx の設定と同等です。

3.3.4 ゲットセット

  • 形式: GETSET キー値
  • 機能: 指定されたキーの値を value に設定し、キーの古い値を返します。
  • 説明: キーが存在するが文字列型ではない場合はエラーを返し、キーが存在しない場合は nil を返します。

3.3.5 mset と msetnx

  • 形式: MSET/MSETNX キー値 [キー値 ...]
  • 機能: 1 つ以上のキーと値のペアを同時に設定します。
  • 注: 指定されたキーが既に存在する場合、MSET は元の古い値を新しい値で上書きします。これが希望どおりの効果ではない場合は、MSETNX コマンドの使用を検討してください。このコマンドは、指定されたすべてのキーが存在しない場合にのみ使用されます。この場合は設定操作を行ってください。MSET/MSETNX はアトミック操作です。指定されたキーはすべて同時に設定されます。指定された一部のキーが更新され、他の指定されたキーが変更されないままになることは不可能です。コマンドは決して失敗しません。

3.3.6 mget

  • 形式: MGET キー [キー ...]
  • 機能: 指定されたキーのすべての (1 つ以上の) 値を返します。
  • 説明: 特定のキーが指定されたキーに存在しない場合、このキーは特別な値 nil を返します。したがって、コマンドが失敗することはありません。

3.3.7 追加

  • 形式: APPEND キー値
  • 機能: キーがすでに存在し、文字列である場合、APPEND コマンドはその値をキーの元の値の末尾に追加します。キーが存在しない場合、APPEND は、SET key value を実行するのと同じように、単に指定されたキーを値に設定します。
  • 説明: 値を追加した後のキーの文字列の長さ。

3.3.8 増減

  • 形式: INCR キーまたは DECR キー

  • 機能: インクリメント、自動インクリメント。keyに格納されている数値を1つインクリメントします。

    decrement,自动递减。将key中存储的数字值减一。
    
  • 注: キーが存在しない場合は、キーの値が 0 に初期化されてから、インクリメント/デクリメント操作が実行されます。値を数値として表現できない場合はエラーを返します。正しく実行された場合は、増加/減少した値を返します。

3.3.9 incrby と decrby

  • 形式: INCRBY キーのインクリメントまたは DECRBY キーのデクリメント
  • 機能: キーに保存されているデジタル値の指定された値を増減します。この値は整数のみであり、負の数も可能ですが、小数は使用できません。
  • 注: キーが存在しない場合は、キーの値が 0 に初期化されてから増加/減少操作が実行されます。値を数値として表現できない場合はエラーを返します。正しく実行された場合は、増加/減少した値が返されます。

3.3.10 incrbyfloat

  • 形式: INCRBYFLOAT キーの増分
  • 機能: キーに格納されている値に浮動小数点数の増分を加算します。
  • 手順: 前と同じ手順。decrbyfloat コマンドはありませんが、インクリメントの負の値により減算の効果が得られます。

3.3.11 strl

  • 形式: STRLEN キー
  • 機能: key に格納されている文字列値の長さを返します。
  • 説明: キーに文字列値が格納されていない場合はエラーを返し、キーが存在しない場合は 0 を返します。

3.3.12 窮屈

  • 形式: GETRANGE キーの開始終了
  • 機能: キー内の文字列値の部分文字列を返します。文字列のインターセプト範囲は、開始と終了を含む開始と終了の 2 つのオフセットによって決まります。
  • 注: end は start より大きくなければなりません。負のオフセットがサポートされています。これは、文字列の末尾から数えることを意味し、-1 は最後の文字を意味し、-2 は最後から 2 番目の文字を意味します。

3.3.13 セットレンジ

  • 形式: SETRANGE キーのオフセット値
  • 機能: 指定されたキーによって格納されている文字列値 str を、オフセット offset から開始して value パラメーターに置き換えます。
  • 注: オフセット値が str の長さより大きい場合、中央はゼロ バイト \x00 で埋められ、つまり 0000 0000 バイトが埋められ、存在しないキーは空の文字列として扱われます。

3.3.14 ビット操作コマンド

名前にBITが含まれるコマンドは、setbit、getbit、bitcount、bittop、bitfieldなどバイナリビットを操作するコマンドであり、一般的には使用されません。

3.3.15 一般的なアプリケーション シナリオ

値が String 型であるアプリケーション シナリオは数多くあります。ここでは、そのような典型的なアプリケーション シナリオの例を示します。

3.3.15.1 データキャッシュ

Redis はデータ キャッシュ レイヤーとして使用され、MySQL はデータ ストレージ レイヤーとして使用されます。アプリケーションサーバーはまずRedisからデータを取得し、キャッシュ層にデータがない場合はMySQLからデータを取得してキャッシュ層に格納してからアプリケーションサーバーに返します。

3.3.15.2 カウンタ

値が数値であるキーをプラットフォームカウンターやビデオ再生カウンターなどとしてRedisに書き込みます。有効なクライアントが訪問するたび、またはビデオが再生されるたびに、Redis のカウンターが直接変更され、MySQL などの非同期方法で他のデータ ソースに永続化されます。

3.3.15.3 セッションの共有


分散型アプリケーションシステムにおいて、ログインサービスを提供するサーバーにユーザーのログイン情報などのセッションデータが保存されている場合、ユーザーが再度集金・決済等のリクエストを送信した場合、集金・決済等のサービス提供時に問題が発生する可能性があります。サーバーにはユーザーのセッション データがないため、ユーザーは再度ログインする必要があります。ユーザーにとって、これは容認できないことです。
この時点で、システム内のすべてのユーザーのすべてのセッション データを Redis に保存できます。ユーザーが新しいリクエストを送信すると、システムはまず Redis で対応するセッション データを検索します。存在する場合は、関連する操作を実行します。それ以外の場合は、ログインページにジャンプします。こうすることで、「再ログイン」の問題は発生しません。

3.3.15.4 速度リミッター

現在、DoS (Denial of Service、サービス妨害) 攻撃を防ぐために、多くのプラットフォームでは一般に、1 秒間に IP へのアクセスが n 回を超えないよう制限しています。また、Redis はキーの有効期限と incr コマンドを組み合わせて速度制限機能を完成させ、速度リミッターとして機能させることができます。
DDoS (分散型サービス拒否) 攻撃を防ぐことはできないことに注意してください。

// 客户端每提交一次请求,都会执行下面的代码

// 等价于set 192.168.192.55 1 ex 60 nx
// 指定新ip作为key的缓存过期时间为60秒
Boolean isExists = redis.set(ip, 1, “EX 60, “NX”);
if(isExists != null || redis.incr(ip) <= 5) {
    
    
    // 通过
} else {
    
    
    // 限流
}

3.4 ハッシュ型値操作コマンド

Redis に保存されたデータの値はハッシュ タイプにすることができます。ハッシュ型は、ハッシュテーブル、辞書などとも呼ばれます。
ハッシュテーブルもキーと値のペアから構成されるマッピングテーブルMapですが、全体のキーと区別するため、ここではキーをフィールド、値を値と呼びます。Redis のハッシュ テーブルのフィールドと値のペアはすべて String 型であることに注意してください。

3.4.1 hset

  • 形式: HSET キーフィールド値
  • 機能: ハッシュ テーブル キーのフィールド field の値を value に設定します。
  • 説明: キーが存在しない場合は、新しいハッシュ テーブルが作成され、HSETが実行されます。フィールド field がハッシュ テーブルに既に存在する場合、古い値は上書きされます。field がハッシュ テーブル内の新しいフィールドで、値が正常に設定された場合は 1 を返します。フィールドがハッシュ テーブルに既に存在し、古い値が新しい値で上書きされている場合は、0 を返します。

3.4.2 hget

  • 形式: HGET キーフィールド
  • 機能: ハッシュ テーブル キーの指定されたフィールド field の値を返します。
  • 説明: 指定されたドメインが存在しない場合、または指定されたキーが存在しない場合は、nil を返します。

3.4.3 ハムセット

  • 形式: HMSET キーフィールド値 [フィールド値 ...]
  • 機能: 複数のフィールドと値 (フィールドと値) のペアを同時にハッシュ テーブルのキーに設定します。
  • 説明: このコマンドは、ハッシュ テーブル内の既存のフィールドを上書きします。キーが存在しない場合は、空のハッシュ テーブルが作成され、HMSET 操作が実行されます。コマンドが正常に実行された場合は、OK を返します。キーがハッシュ型でない場合はエラーを返します。

3.4.4 hmget

  • 形式: HMGET キーフィールド [フィールド ...]
  • 機能: ハッシュ テーブル キー内の 1 つ以上のフィールドの値を指定された順序で返します。
  • 説明: 指定されたフィールドがハッシュ テーブルに存在しない場合は、nil 値を返します。存在しないキーは空のハッシュ テーブルとして扱われるため、存在しないキーに対する HMGET 操作は nil 値のみを含むテーブルを返します。

3.4.5 hgetall

  • 形式: HGETALL キー
  • 機能: ハッシュ テーブル キーのすべてのフィールドと値を返します。
  • 説明: 戻り値では、各ドメイン名 (フィールド名) の直後がフィールドの値 (値) であるため、戻り値の長さはハッシュ テーブルのサイズの 2 倍になります。キーが存在しない場合は、空のリストを返します。キーに多数の要素が含まれている場合、このコマンドは Redis サービスをブロックする可能性があります。したがって、このコマンドは通常、本番環境では使用されず、代わりに hscan コマンドが使用されます。

3.4.6 hsetnx

  • 形式: HSETNX キーフィールド値
  • 機能: フィールド field が存在しない場合に限り、ハッシュ テーブル キーのフィールド field の値を value に設定します。
  • 注: フィールドフィールドがすでに存在する場合、この操作は無効です。キーが存在しない場合は、新しいハッシュ テーブルが作成され、HSETNX コマンドが実行されます。

3.4.7 hdel

  • 形式: HDEL キーフィールド [フィールド ...]
  • 機能: ハッシュ テーブル キー内の 1 つ以上の指定されたドメインを削除します。存在しないドメインは無視されます。
  • 説明: 無視されたドメインを除く、正常に削除されたドメインの数を返します。

3.4.8 ヘグジット

  • 形式: HEXISTS キーフィールド
  • 機能: 指定されたフィールド field がハッシュ テーブル キーに存在するかどうかを確認します。
  • 説明: ハッシュ テーブルに指定されたフィールドが含まれている場合は 1 を返します。指定されたフィールドが存在しない場合、またはキーが存在しない場合は 0 を返します。

3.4.9 hincrby と hincrbyfloat

  • 形式: HINCRBY キー フィールドの増分
  • 機能: ハッシュ テーブル キーのフィールド field の値に増分を追加します。hincrby コマンドは整数値のみをインクリメントできますが、hincrbyfloat は 10 進数値をインクリメントできます。
  • 注: 増分は負の数にすることもできます。これは、指定されたフィールドの減算演算と同等です。キーが存在しない場合は、新しいハッシュ テーブルが作成され、HINCRBY コマンドが実行されます。フィールド field が存在しない場合、コマンドを実行する前にフィールドの値は 0 に初期化されます。文字列値を格納するフィールドに対して HINCRBY コマンドを実行すると、エラーが発生します。

3.4.10 キーとクジラ

  • 形式: HKEYS キーまたは HVALS キー
  • 機能: ハッシュ テーブル キー内のすべてのフィールド/値を返します。
  • 説明: キーが存在しない場合は、空のリストを返します。

3.4.11を満たす

  • 形式: HLEN キー
  • 機能: ハッシュ テーブル キー内のドメインの数を返します。
  • 説明: キーが存在しない場合は 0 を返します。

3.4.12 hstrlen

  • 形式: HSTRLEN キーフィールド
  • 機能: ハッシュ テーブル キーの指定されたドメイン フィールドに関連付けられた値の文字列長 (文字列長) を返します。
  • 説明: 指定されたキーまたはフィールドが存在しない場合、コマンドは 0 を返します。

3.4.13 アプリケーションシナリオ

ハッシュ タイプの値は、オブジェクト データの保存に非常に適しています。キーはオブジェクトの名前、値はオブジェクトのプロパティを説明するマップです。オブジェクトのプロパティの変更は Redis で直接行うことができます。文字列型の値ストレージ オブジェクトとは異なり、そのオブジェクトは JSON 文字列にシリアル化されるなど、シリアル化されます。オブジェクト属性値の変更は、変更前にオブジェクトに逆シリアル化され、変更後に JSON 文字列にシリアル化される必要があります。変更 Redis に書き込みます。

3.5 リスト型値操作コマンド

Redis に保存されたデータの値は、文字列リスト タイプのデータにすることができます。つまり、リスト内の各要素は String 型のデータです。リスト内のデータは挿入順に並べ替えられます。ただし、リストの最下層は実際には先頭ノードのない二重結合リストであるため、リストの先頭と末尾の演算性能は高いものの、中間要素の挿入や削除の性能は相対的に劣ります。

3.5.1 lpush/rpush

  • 格式:LPUSH キーの値 [値 …] または RPUSH キーの値 [値 …]
  • 機能: リストキーのヘッダー/フッターに 1 つ以上の値 value を挿入します (ヘッダーが左側、末尾が右側になります)
  • 注: 複数の値がある場合、lpush の場合、各値は左から右の順序でヘッダーに挿入され、rpush の場合、各値は左から右の順序でテーブルの末尾に挿入されます。キーが存在しない場合は、空のリストが作成され、操作が実行されます。キーは存在するがリスト型ではない場合はエラーを返します。成功した場合はリストの長さを返します。

3.5.2 カーテン

  • 形式: LLEN キー
  • 機能: リストのキーの長さを返します。
  • 説明: key が存在しない場合、key は空のリストとして解釈され、0 が返されます。key がリスト型でない場合はエラーを返します。

3.5.3 行インデックス

  • 形式: LINDEX キーインデックス
  • 機能: リストキーの添字がindexである要素を返します。リストは 0 から数えられます。
  • 説明: インデックスパラメータの値がリストの範囲内にない (範囲外) 場合は、nil を返します。

3.5.4セット

  • 形式: LSET キーのインデックス値
  • 機能: リスト内のキー添字がインデックスである要素の値を value に設定します。
  • 説明: インデックス パラメータが範囲外の場合、または空のリスト (キーが存在しない) に対して LSET が実行された場合、エラーが返されます。

3.5.5 lrange

  • 形式: LRANGE キー スタート ストップ
  • 機能: リスト キーの指定された間隔 [start, stop] 内の要素を返します。これには 2 つのエンドポイントが含まれます。
  • 注: List の添字は 0 から始まります。つまり、0 はリストの最初の要素を表し、1 はリストの 2 番目の要素を表します。負の添え字も使用できます。-1 はリストの最後の要素を表し、-2 はリストの最後から 2 番目の要素を表します。範囲外の添字値はエラーを引き起こしません。開始インデックスがリストの最大インデックスより大きい場合、LRANGE は空のリストを返します。stop 添字が最大添字より大きい場合、Redis は stop の値を最大添字に設定します。

3.5.6 lpushx と rpushx

  • 形式: LPUSHX キー値またはRPUSHX キー値
  • 機能: キーが存在し、リストである場合に限り、リスト キーのヘッダー/フッターに値 value を挿入します。
  • 説明: キーが存在しない場合、コマンドは何も実行しません。実行が成功すると、テーブルの長さが出力されます。

3.5.7 レンズ付き

  • 形式: LINSERT キー BEFORE|AFTER ピボット値
  • 機能: 要素ピボットの前または後のリスト キーに値 value を挿入します。
  • 説明: ピボット要素がリストに存在しない場合は、何も実行されず -1 が返されます。キーが存在しない場合は、キーは空のリストとみなされ、何も実行されず 0 が返されます。 key はリスト型ではないため、エラーが返されます。コマンドが成功した場合は、挿入操作の完了後にリストの長さを返します。

3.5.8 lpop / rpop

  • 形式: LPOP キー [数] または RPOP キー [数]
  • 機能: リストキーの先頭/末尾から count 個の要素を削除し、削除した要素を返します。カウントのデフォルト値 1
  • 説明: キーが存在しない場合は nil を返します

3.5.9 blpop / brpop

  • 形式: BLPOP キー [キー …] タイムアウトまたは BRPOP キー [キー …] タイムアウト
  • 機能: BLPOP/BRPOP は、リストのポップアップをブロックするコマンドです。これらは、LPOP/RPOP コマンドのブロック バージョンです。指定されたリストにポップする要素がない場合、待機タイムアウトが期限切れになるか、ポップできる要素が見つかるまで、接続は BLPOP/BRPOP コマンドによってブロックされます。複数のキー パラメータが指定された場合、パラメータ キーの順序に従って各リストが順番にチェックされ、空ではない最初のリストの先頭要素がポップアップされます。timeout はブロック期間 (秒単位) で、値が 0 の場合は、ポップアップ要素がない限り常にブロックされることを意味します。
  • 説明: 指定された時間内に要素がポップアップされない場合は、nil と待機時間を返します。それ以外の場合は、2 つの要素を含むリストを返します。最初の要素はポップされた要素が属するキーで、2 番目の要素はポップされた要素の値です。

3.5.10 rpoplpush

  • 形式: RPOPLPUSH ソース宛先
  • 機能: RPOPLPUSH をコマンドして、アトミック時間内に次の 2 つのアクションを実行します。
  • リストソースの最後の要素 (末尾要素) をポップし、クライアントに返します。
  • ソースからのポップアップ要素を宛先リストの先頭要素として宛先リストに挿入します。

ソースが存在しない場合は、値 nil が返され、他のアクションは実行されません。ソースと宛先が同じ場合、リストの末尾の要素が先頭に移動され、その要素が返されます。この特殊なケースは、リストの回転操作と考えることができます。

3.5.11 brpoplpush

  • 形式: BRPOPLPUSH ソース宛先タイムアウト
  • 機能: BRPOPLPUSH は RPOPLPUSH のブロック バージョンです。指定されたリスト ソースが空でない場合、BRPOPLPUSH は RPOPLPUSH と同じように動作します。リストのソースが空の場合、BRPOPLPUSH コマンドは、待機がタイムアウトになるか、別のクライアントがソースに対して LPUSH または RPUSH コマンドを実行するまで、接続をブロックします。timeout はブロック期間 (秒単位) で、値が 0 の場合は、ポップアップ要素がない限り常にブロックされることを意味します。
  • 説明: 指定された時間内に要素がポップアップされない場合は、nil と待機時間を返します。それ以外の場合は、2 つの要素を含むリストを返します。最初の要素はポップされた要素の値、2 番目の要素は待機時間です。

3.5.12 レム

  • 形式:LREMキーカウント値
  • 機能: パラメーター数の値に従って、パラメーター値と等しいリスト内の要素を削除します。count の値は次のいずれかになります。
  • count > 0 : テーブルの先頭から末尾までを検索し、count 個の value に等しい要素を削除します。
  • count < 0 : テーブルの末尾からテーブルの先頭まで検索し、value に等しい要素を削除します。数値は count の絶対値です。
  • count = 0 : value に等しいすべての値をテーブルから削除します。
  • 説明: 削除された要素の数を返します。キーが存在しない場合、存在しないキーは空のリスト(空リスト)とみなされ、LREMコマンドは0を返します。

3.5.13 ltrim

  • 形式: LTRIM キー スタート ストップ
  • 機能: リストをトリミングします。つまり、リストには指定された範囲内の要素のみが保持され、指定された範囲内にない要素は削除されます。
  • 説明: 添字 (インデックス) パラメーターの start と stop は 0 に基づいています。つまり、0 はリストの最初の要素を表し、1 はリストの 2 番目の要素を表し、以下同様となります。負の添え字も使用できます。-1 はリストの最後の要素を表し、-2 はリストの最後から 2 番目の要素を表します。key がリスト型でない場合はエラーを返します。開始添え字がリストの最大の添え字終了 (LLEN リストから 1 を引いたもの) より大きい場合、または開始 > 停止の場合、LTRIM はすでにリスト全体を空にしているため、LTRIM は空のリストを返します。stop 添字が end 添字より大きい場合、Redis は stop の値を end に設定します。

3.5.14 アプリケーションシナリオ

値がリスト型であるアプリケーション シナリオは数多くあり、対応するビジネス機能は主にさまざまなデータ構造を構築することによって実現されます。ここでは、具体的な例は示さず、これらのデータ構造の実装方法のみを要約します。

3.5.14.1 スタック

スタック データ構造の効果は、lpush + lpop: first in last out によって実現できます。lpush を使用してリストの左側からデータを挿入し、lpop を使用してリストの左側からデータを取得します。もちろん、rpush + rpop を使用しても同じ効果を実現できますが、その操作はリストの右側にあります。

3.5.14.2 キュー

キュー データ構造の効果は、lpush + rpop: 先入れ先出しによって実現できます。lpush を使用してリストの左側からデータを挿入し、rpop を使用してリストの右側からデータを取得します。もちろん、rpush + lpop でも同じ効果が得られますが、動作の方向がまったく逆になります。

3.5.14.3 メッセージキューのブロック

メッセージ キューのブロック効果は、lpush + brpop によって実現できます。メッセージ プロデューサーとしてのクライアントは lpush を使用してリストの左側からデータを挿入し、メッセージ コンシューマとしての複数のクライアントは brpop ブロッキングを使用して、リストの最後にあるデータを消費のために「プリエンプト」して、負荷分散と高可用性を確保します。消費の。brpop のタイムアウトは 0 に設定されています。これは、ポップするデータがない限り、永久にブロックされることを意味します。

3.5.14.4 動的有限集合

有限コレクションは lpush + ltrim で実現できます。lpush でリストの左からデータを追加し、ltrim でコレクションの動的な有限性を保ちます。企業の末端や学校の主要クラスの排除などの動的な管理は、この動的な限定セットを通じて実現できます。もちろん、rpush + ltrim でも同じ効果が得られますが、操作の方向はまったく逆になります。

3.6 セット型値操作コマンド

Redis データ ストレージの値は Set コレクションにすることができ、コレクション内の各要素は String 型になります。Set は List に非常に似ていますが、Set の要素は無秩序で反復不可能であるのに対し、List は規則的で反復可能であるという点が異なります。
Redis の Set コレクションは Java の Set コレクションに似ており、その最下層は値が null のハッシュ テーブルです。だからこそ、乱れや再現性のなさが生じるのです。

3.6.1 悲しい

  • 形式: SADD キー メンバー [メンバー ...]
  • 機能: 1 つ以上のメンバー要素をコレクション キーに追加します。コレクション内に既に存在するメンバー要素は無視されます。
  • 説明: キーが存在しない場合は、メンバー要素のみをメンバーとして含むコレクションを作成します。key がコレクション型でない場合はエラーを返します。

3.6.2 メンバー

  • 形式: SMEMBERS キー
  • 機能: 設定されたキー内のすべてのメンバーを返します。
  • 注: 存在しないキーは空のコレクションとみなされます。キーに多数の要素が含まれている場合、このコマンドは Redis サービスをブロックする可能性があります。したがって、このコマンドは通常、運用環境では使用されず、代わりに sscan コマンドが使用されます。

3.6.3 カード

  • 形式: SCARD キー
  • 関数: Set コレクションの長さを返します。
  • 説明: キーが存在しない場合は 0 を返します。

3.6.4 システムメンバー

  • 形式: SISMEMBER キーメンバー
  • 機能: メンバー要素がセットキーのメンバーであるかどうかを判断します。
  • 説明: member 要素がコレクションのメンバーである場合は 1 を返します。メンバー要素がセットのメンバーではない場合、またはキーが存在しない場合は 0 を返します。

3.6.5 の動き

  • 形式: SMOVE ソース宛先メンバー
  • 機能: メンバー要素をソース コレクションから宛先コレクションに移動します。
  • 説明: ソース コレクションが存在しないか、指定されたメンバー要素が含まれていない場合、SMOVE コマンドは何も行わず 0 を返します。それ以外の場合、メンバー要素はソース コレクションから削除され、宛先コレクションに追加され、1 が返されます。宛先コレクションに既にメンバー要素が含まれている場合、SMOVE コマンドはソース コレクション内のメンバー要素を単純に削除します。ソースまたは宛先がコレクション型ではない場合、エラーを返します。

平均3.6.6

  • 形式: SREM キーメンバー [メンバー ...]
  • 機能: セットキー内の 1 つ以上のメンバー要素を削除します。存在しないメンバー要素は無視され、正常に削除された要素の数を返します。
  • 説明: キーがコレクション型ではない場合、エラーが返されます。

3.6.7 サンドメンバー

  • 形式: SRANDMEMBER キー [カウント]
  • 機能: コレクション内のランダムな要素数を返します。count のデフォルト値は 1 です。
  • 説明: count が正の数で、コレクションの長さより小さい場合は、count 要素を含む配列を返しますが、配列内の要素は異なります。count がコレクションの長さ以上の場合、コレクション全体が返されます。count が負の場合、count 要素の絶対値を含む配列を返しますが、配列内の要素が重複して表示される場合があります。

3.6.8 スポップ

  • 形式:SPOPキー[カウント]
  • 機能: コレクション内の count 個のランダムな要素を削除して返します。count は正の数である必要があり、デフォルト値は 1 です。
  • 説明: count がコレクションの長さ以上の場合、コレクション全体を削除して返します。

3.6.9 sdiff / sdiffstore

  • 形式: SDIFF キー [キー ...] または SDIFFSTORE 宛先キー [キー ...]
  • 機能: 最初のセットと他のセットの差を返します。差分セット、差分。
  • 説明: これら 2 つのコマンドの違いは、sdiffstore は差分を表示するだけでなく、指定された設定先に差分を保存できることです。宛先コレクションが既に存在する場合、上書きされます。存在しないキーは空のセットとみなされます。

3.6.10 焼結/焼結ストア

  • 形式: SINTER キー [キー ...] または SINTERSTORE 宛先キー [キー ...]
  • 機能: 複数のコレクション間の共通部分を返します。交差点、交差点。
  • 説明: これら 2 つのコマンドの違いは、sinterstore は交差を表示するだけでなく、指定された設定された宛先に交差を保存できることです。宛先コレクションが既に存在する場合、上書きされます。存在しないキーは空のセットとみなされます。

3.6.11 スニオン / サニオンストア

  • 形式: SUNION キー [キー ...] または SUNIONSTORE 宛先キー [キー ...]
  • 機能: 複数のコレクション間の和集合を返します。連合。
  • 説明: これら 2 つのコマンドの違いは、sunionstore は共用体を表示するだけでなく、指定された収集先に共用体を保管できることです。宛先コレクションが既に存在する場合、上書きされます。存在しないキーは空のセットとみなされます。

3.6.12 アプリケーションシナリオ

値が Set タイプであるアプリケーション シナリオは数多くありますが、ここではこれらのシナリオのみを要約します。

3.6.12.1 動的な黒と白のリスト


例えば、アクセス制御のためのブラックリストをサーバーに設定する必要があります。ブラックリストがサーバーの構成ファイルに直接書き込まれる場合、問題は、ブラックリストを動的に変更できないことです。このとき、ブラックリストは Redis に直接書き込むことができます。サーバーにアクセスするクライアントが存在する限り、サーバーはクライアント IP を取得した後、まずその IP が Redis ブラックリストに存在するかどうかを確認します。存在する場合は、アクセスが許可されます。拒否されます。それ以外の場合はアクセスが許可されます。

3.6.12.2 有限乱数

限定乱数とは、返却される乱数が抽選や抽選など一定の設定範囲内の乱数に基づく乱数であることを意味します。spop または srandmember を通じて、指定されたコレクションから要素をランダムに選択できます。

3.6.12.3 ユーザーのポートレート

ユーザーの登録とログインを必要とするソーシャルプラットフォームや電子商取引プラットフォームなどのさまざまなプラットフォームでは、ユーザーが提供した情報やユーザーの使用習慣に基づいて各ユーザーのポートレートを作成します。つまり、ユーザーごとに多くのタグを定義して、ユーザーの特性を反映したタグをsaddを利用してユーザーに対応したコレクションに追加することができます。これらのタグには順序がなく、繰り返しがありません。
同時に、プラットフォームはシンター/シンターストアを使用して、ユーザーのポートレートの交差に基づいて友人、製品、顧客を推奨することもできます。

3.7 オーダードセット型値操作コマンド

Redis に格納されたデータの値は順序付けられた Set にすることができ、この順序付けされた Set 内の各要素は String 型になります。順序付きセットとセットの違いは、順序付きセットの各要素にスコアがあり、Redis はスコアの値に従ってセットを小さいものから大きいものに並べ替えることです。Set コレクションと同じ要件があり、要素を繰り返すことはできませんが、要素のスコアは繰り返すことができます。このタイプのコマンドはすべて z という文字で始まるため、この Set は ZSet とも​​呼ばれます。

3.7.1 ザッド

  • 格式:ZADD キースコアメンバー [[スコアメンバー] [スコアメンバー] …]
  • 機能: 1 つ以上のメンバー要素とそのスコア値を順序付きセット キーの適切な位置に追加します。
  • 説明: スコア値は、整数値または倍精度浮動小数点数です。キーが存在しない場合は、空のソートセットが作成され、ZADD が実行されます。キーは存在するがソートセット型ではない場合、エラーを返します。コマンドが成功すると、更新された既存のメンバーを除く、正常に追加された新しいメンバーの数が返されます。書き込まれたメンバー値がすでに存在するが、スコア値が異なる場合、新しいスコア値が古いスコアを上書きします。

3.7.2 zrangeとzrevrange

  • 形式: ZRANGE キー スタート ストップ [WITHSCORES] または ZREVRANGE キー スタート ストップ [WITHSCORES]
  • 機能: 順序付きセット キー内の指定された間隔のメンバーを返します。zrange コマンドはスコア値の昇順に並べ替え、zrevrange コマンドはスコアの降順に並べ替えます。同じスコア値を持つメンバーは、辞書順/逆辞書順に並べ替えられます。WITHSCORES オプションを使用すると、メンバーのスコア値を返すことができます。
  • 注: 添字パラメータは 0 から始まります。つまり、0 は順序付きセットの最初のメンバーを表し、1 は順序付きセットの 2 番目のメンバーを表します。最後のメンバーには -1、最後から 2 番目のメンバーには -2 など、負の添字を使用することもできます。範囲外の添字はエラーを引き起こしません。たとえば、start の値がソートされたセットの最大の添え字より大きい場合、または start > stop の場合、ZRANGE コマンドは単に空のリストを返します。別の例として、stop パラメーターの値が順序付きセットの最大添字より大きい場合、Redis は stop を最大添字として扱います。

キーの指定範囲に多数の要素が含まれている場合、このコマンドは Redis サービスをブロックする可能性があります。したがって、実稼働環境で順序付きセット内のすべての要素をクエリする場合は、通常、このコマンドを使用せず、代わりに zscan コマンドを使用します。

3.7.3 zrangebyscore と zrevrangebyscore

  • 形式: ZRANGEBYSCORE キー最小最大 [WITHSCORES] [LIMIT オフセット数]

ZREVRANGEBYSCORE キー max min [WITHSCORES] [LIMIT オフセット数]

  • 機能: 順序付きセット キー内のスコア値が最小値と最大値の間 (最小値または最大値に等しいことを含む) であるすべてのメンバーを返します。順序付きセットのメンバーは、スコア値の昇順/降順に配置されます。同じスコア値を持つメンバーは、辞書順/逆辞書順に並べ替えられます。オプションの LIMIT パラメータは、返される結果の数と範囲を指定します (SQL の SELECT LIMIT オフセット、カウントなど)。オフセットが大きい場合、オフセットを見つける操作は、順序付けされたセット全体を走査する必要がある場合があり、その処理が少なくなる可能性があることに注意してください。効率が低い。オプションの WITHSCORES パラメーターは、結果セットが順序付きセットのメンバーのみを返すか、順序付きセットのメンバーとそのスコア値を一緒に返すかを決定します。
  • 注: min と max の値はプラスまたはマイナスの無限大です。デフォルトでは、間隔の値には閉じた間隔 (以下またはそれ以上) が使用されます。また、左括弧 "(" を追加することで、オプションの開いた間隔 (以下またはそれ以上) を使用することもできます。パラメータの前に。

3.7.4 zカード

  • フォーマット:ZCARDキー
  • 機能: コレクションの長さを返します。
  • 説明: キーが存在しない場合は 0 を返します。

3.7.5 zcount

  • 形式: ZCOUNT キー最小最大
  • 機能: 順序付きセット キー内のスコア値が最小値と最大値の間にあるメンバーの数 (デフォルトで最小値または最大値に等しいスコア値を含む) を返します。

3.7.6 zスコア

  • 形式: ZSCORE キーメンバー
  • 機能: 順序付きセット キーのメンバー メンバーのスコア値を返します。
  • 説明: メンバー要素が順序付きセットキーのメンバーではない場合、またはキーが存在しない場合は、nil を返します。

3.7.7 ジンクビー

  • 形式: ZINCRBY キー増分メンバー
  • 機能: 順序付きセット キーのメンバー メンバーのスコア値に増分を加算します。インクリメント値には、整数値または倍精度浮動小数点数を指定できます。
  • 注: 負の値の増分を渡すことで、スコアから対応する値を減算できます。キーが存在しない場合、またはメンバーがキーのメンバーではない場合、ZINCRBY キー増分メンバーは ZADD キー増分メンバーと同等です。キーがソートセットタイプでない場合はエラーを返します。コマンドが正常に実行されると、メンバー member の新しいスコア値が返されます。

3.7.8 zrankとzrevrank

  • 形式: ZRANK キー メンバーまたはZREVRANK キー メンバー
  • 機能: 順序付きセット キー内のメンバー メンバーのランクを返します。zrank コマンドはスコア値の昇順に並べ替え、zrevrank コマンドはスコアの降順に並べ替えます。
  • 説明: スコア値が最小のメンバーのランクは 0 です。member がソートされたセットキーのメンバーでない場合は nil を返します。

3.7.9歳

  • 形式: ZREM キーメンバー [メンバー ...]
  • 機能: 順序付きセット キー内の 1 つ以上のメンバーを削除すると、存在しないメンバーは無視されます。
  • 説明: キーは存在するが、順序付きセット タイプではない場合、エラーが返されます。成功すると、無視されたメンバーを除いた、正常に削除されたメンバーの数が返されます。

3.7.10 zremrangebyrank

  • 形式: ZREMRANGEBYRANK キー開始停止
  • 機能: 順序付きセット キー内の指定されたランク間隔内のすべてのメンバーを削除します。
  • 説明: ランキング間隔は、start と stop を含む添え字パラメーター start と stop によって示されます。ランク間隔パラメーターは 0 から始まります。つまり、0 は 1 位のメンバーを意味し、1 は 2 位のメンバーを意味します。負の数値も使用できます (最後のメンバーには -1、最後から 2 番目のメンバーには -2 など)。コマンドが正常に実行されると、削除されたメンバーの数が返されます。

3.7.11 zremrangebyscore

  • 形式: ZREMRANGEBYSCORE キー最小最大
  • 機能: 順序付きセット キー内のスコア値が最小と最大の間 (最小または最大に等しい場合を含む) であるすべてのメンバーを削除します。
  • 注: コマンドが正常に実行されると、削除されたメンバーの数が返されます。

3.7.12 ズレンジビレックス

  • 形式: ZRANGEBYLEX キー最小最大 [LIMIT オフセット数]
  • 機能: このコマンドは、セット内のすべてのメンバーが同じスコアを持つ場合にのみ適用されます。ソートされたセットのすべてのメンバーが同じスコアを持つ場合、ソートされたセットの要素はメンバーの辞書編集順に従ってソートされます。つまり、このコマンドは、要素値が最小と最大の間の指定されたセットのメンバーを返します。ソートセット内のメンバーのスコアが異なる場合、コマンドの実行結果は zrange キーと同じになります。
  • 注: 有効な min および max パラメータには、左括弧「(」または左括弧「[」が含まれている必要があります。左括弧「(」は開いた間隔を示し、左括弧「[」は閉じた間隔を示します。min または max 特殊文字「+」 「-」は、それぞれ正の無限大と負の無限大を表すために使用することもできます。

3.7.13 zlexcount

  • 形式: ZLEXCOUNT キー最小最大
  • 機能: このコマンドは、セット内のすべてのメンバーが同じスコアを持つ場合にのみ適用されます。このコマンドは、要素値自体 (スコア値ではない) が最小値と最大値の範囲内にあるセット内の要素の数を返します。

3.7.14 ズレムレンジバイレックス

  • 形式: ZREMRANGEBYLEX キー最小最大
  • 機能: このコマンドは、セット内のすべてのメンバーが同じスコアを持つ場合にのみ適用されます。このコマンドは、要素値自体が min と max の範囲内にあるコレクション内のすべての要素を削除します。

3.7.15 アプリケーションシナリオ

順序付きセットの最も一般的な適用シナリオは、音楽やビデオのプラットフォームでの再生量でソートされたランキング リスト、電子商取引プラットフォームでのユーザーの評価や販売量でソートされたランキング リストなどのランキング リストです。 。再生量をスコア、作品idを会員、ユーザーの評価点や販売数をスコア、加盟店idを会員として利用します。Zincrby を使用して並べ替えスコアを増やし、zrevrange を使用して上位数を取得し、zrevrank を使用して現在のランキングをクエリし、zscore を使用して現在の並べ替えスコアをクエリします。

3.8 ベンチマークテストツール

3.8.1 はじめに

Redis をインストールすると、Redis のパフォーマンスをテストするためのストレス テスト ツールである redis-benchmark テスト ツールが自動的にインストールされます。

redis-benchmark –help コマンドを使用してその使用法を表示できます:

多くのオプションがあります。例を使用して一般的に使用されるオプションの使用法を学習しましょう。

3.8.2 テスト 1

3.8.2.1 コマンド解析


上記のコマンドのオプションの意味は次のとおりです。

  • -h: テストするRedisのIPを指定します。ローカルの場合は省略できます。
  • -p: テストするRedisのポートを指定します。6379の場合は省略可能
  • -c: シミュレートされるクライアントの数を指定します。デフォルト値は 50 です。
  • -n: これらのクライアントによって行われたリクエストの合計数を指定します。デフォルト値は 100000 です。
  • -d: get/setコマンドのテスト時に演算する値のデータ長をバイト単位で指定します。デフォルト値は3です。この指定は、他のコマンドをテストする場合には役に立ちません。

上記のコマンドの意味は、100 クライアントを使用して Redis に接続することです。これらのクライアントは合計 100,000 リクエストを開始し、set/get の値は 8 バイトのデータです。

3.8.2.2 テスト結果の分析

このコマンドはすべての Redis コマンドを 1 つずつテストし、各コマンドはテスト レポートを生成します。各テスト レポートは 4 つの部分で構成されます。

3.8.2.2.1 テスト環境レポート

1 つ目はテスト環境です。

3.8.2.2.2 レイテンシの割合の分布

これはパーセンテージ別の統計レポートです。残りのテスト量の 50% が完了するたびに統計が表示されます。

3.8.2.2.3 レイテンシの累積分布

これは時間間隔の統計 (基本的に 0.1 ミリ秒ごと) に基づいたレポートです。

3.8.2.2.4 概要レポート

概要レポートです。

3.8.3 テスト 2


上記のコマンドのオプションの意味は次のとおりです。

  • -t: テストするコマンドを指定します。複数のコマンドはカンマで区切られ、スペースは含まれません
  • -q: 概要レポートのみを提供することを指定します。

3.9 単純な動的文字列 SDS

3.9.1 SDS の概要

Redis Key であっても Value であっても、その基本的なデータ型は文字列です。たとえば、Hash 型 Value のフィールドと値の型、List 型、Set 型、および ZSet 型 Value の要素型はすべて文字列です。Redis は標準の C 言語を使用して開発されていますが、C 言語の従来の文字列表現を直接使用するのではなく、文字列をカスタマイズします。このような文字列自体の構造は比較的単純ですが、その機能は非常に強力で、シンプルダイナミックストリング、Simple Dynamic String、略してSDSと呼ばれます。
Redis のすべての文字列が SDS であるわけではなく、C 文字列も表示されることに注意してください。C 文字列は文字列「リテラル定数」内にのみ出現でき、その文字列は変更できません。
redisLog(REDIS_WARNNING, “sdfsfsafsafds”);

3.9.2 SDS の構造

SDS は C 文字列とは異なります。C 文字列自体は、二重引用符で囲まれ、ヌル文字 '\0' で終了する一連の文字です。ただし、SDS は、Redis インストール ディレクトリの src/sds.h で定義された構造です。

| struct sdshdr { // 文字列char buf[] の保存に使用されるバイト配列; // SDS の長さと呼ばれる buf[] で使用されるバイト数int len; // buf[] 内の未使用ワード セクションの数イントフリー。





}
例如执行SET country “China”命令时,键country与值”China”都是SDS类型的,只不过一个是SDS的变量,一个是SDS的字面常量。”China”在内存中的结构如下:


上記の構造から、SDS の buf 値は実際にはヌル文字 '\0' を含む C 文字列であり、合計 6 バイトを占めることがわかります。ただし、SDS の len にはヌル文字「\0」が含まれません。

この構造と前の構造の違いは、ここに 3 バイトの未使用スペースがあることです。

3.9.3 SDS の利点

C 文字列は、長さが Len+1 の文字配列を使用して、実際の長さが Len である文字列を表します。文字配列の末尾は、文字列の終わりを示すヌル文字 '\0' で終わります。この構造は単純ですが、文字列の機能、セキュリティ、効率に関する Redis の要件を満たすことができません。

3.9.3.1 「文字列長の取得」のパフォーマンスボトルネックを回避する

C 文字列の場合、その長さを取得するには、文字列全体を走査する必要があります。超長い文字列を走査する場合、それがシステムのパフォーマンスのボトルネックになります。
ただし、文字列の長さデータは SDS 構造に直接格納されるため、文字列の長さを取得するために必要なシステムパフォーマンスは文字列自体の長さとは無関係であり、Redis のパフォーマンスのボトルネックにはなりません。

3.9.3.2 バイナリセキュリティの確保

C 文字列には、ASCII、UTF-8 などの特定のエンコード形式に準拠する文字のみを含めることができ、ヌル文字 '\0' は文字列の末尾を除く他の位置に含めることはできません。それ以外の場合は、文字列がプログラムは途中で終了すると誤って解釈されます。写真、オーディオ、ビデオ、圧縮ファイル、オフィス ファイルなどのバイナリ データでは、ヌル文字「\0」を区切り文字として使用することが非常に一般的です。したがって、画像、オーディオ、ビデオ、圧縮ファイル、オフィス ファイルなどのバイナリ データを C 文字列に格納することはできません。
ただし、SDS は文字列の終わりとしてヌル文字 '\0' を使用せず、len 属性を使用して文字列が終了するかどうかを判断します。したがって、プログラムが SDS 内の文字列データを処理する場合、データに対して制限、フィルター、または仮定を行う必要はなく、データを読み取るだけで済みます。データに書き込まれた内容が読み取られます。

3.9.3.3 メモリの再割り当て時間を短縮する

SDS は、メモリの再割り当ての問題を回避するために、スペースの事前割り当て戦略と遅延スペース解放戦略を採用しています。
スペース事前割り当て戦略とは、SDS がスペースを拡張するたびに、プログラムが必要なスペースを割り当てるだけでなく、メモリの再割り当ての回数を減らすために追加の未使用スペースも割り当てることを意味します。追加で割り当てられる未使用スペースは、スペース拡張後の SDS の len 属性の値によって異なります。

  • len 属性の値が 1M 未満の場合、割り当てられる未使用スペースのサイズは len 属性の値と同じになります。
  • len 属性の値が 1M 以上の場合、割り当てられる未使用の空き領域のサイズは 1M に固定されます。

SDS は、スペース解放に遅延スペース解放戦略を採用しています。この戦略は、SDS 文字列の長さが短くなった場合、余分な未使用スペースが一時的に解放されず、追加されて空き領域になることを意味します。後でSDSを拡張する際のメモリの再割り当ての回数を減らすため。
SDS の未使用領域を解放したい場合は、sdsRemoveFreeSpace()関数を使用して解放できます。

3.9.3.4 C 関数との互換性

Redis は、ユーザーによる Redis の二次開発を容易にするために、多くの SDS API を提供します。C 関数との互換性を保つために、SDS の基になる配列 buf[] 内の文字列は依然としてヌル文字 '\0' で終わります。
ここで比較する 2 つの側、1 つは SDS で、もう 1 つは C 文字列です。このとき、C 言語関数 strcmp
(sds_str->buf, c_str)を使用できます。

3.9.4 よく使用されるSDS操作関数

次の表に、一般的に使用されるいくつかの SDS 操作関数とその関数の説明を示します。

関数 機能説明
sdsnew() 指定された C 文字列を使用して SDS を作成する
sdsempty() 文字列データを含まない SDS を作成する
sdsdup() 指定されたSDSのコピーを作成します
sdsfree() 指定されたSDSを解放します
sdsclear() 指定したSDSの文字列内容をクリアします。
sdslen() 指定された SDS の使用済みスペース len 値を取得します
sdsavail() 指定したSDSの未使用領域の空き値を取得します
sdsMakeRoomFor() 指定したSDSの空き容量を指定したサイズだけ増やす
sdsRemoveFreeSpace() 指定したSDSの空き領域を解放します
sdscat() 指定された C 文字列を指定された SDS 文字列の末尾に接続します
sdscatsds() 指定された SDS 文字列を別の指定された SDS 文字列の末尾に結合します
sdscpy() 指定された C 文字列を指定された SDS にコピーし、元の SDS 文字列の内容を上書きします。
sdsgrouzero() SDS 文字列を指定された長さまで拡張します。この展開にはヌル文字「\0」が埋め込まれています。
sdsrange() 指定されたSDS内の指定された範囲の文字列をインターセプトします
sdstream() 指定された SDS 内の指定された C 文字列内のすべての文字の出現をすべて削除します。
sdsemp() 指定された 2 つの SDS 文字列が同じかどうかを比較します
sdstolow() 指定された SDS 文字列内のすべての文字を小文字に変更します
sdstoupper() 指定された SDS 文字列内のすべての文字を大文字にします

3.10 コレクションの基本的な実装原則

Redis の Set 型の基礎となる実装では、hashTable を直接使用します。ただし、Hash、ZSet、および List コレクションの基礎となる実装は、Redis の高いパフォーマンスを確保するために特別に設計されています。

3.10.1 2 つの実装オプション

对于Hash与ZSet集合,其底层的实现实际有两种:压缩列表zipList,与跳跃列表skipList。这两种实现对于用户来说是透明的,但用户写入不同的数据,系统会自动使用不同的实现。只有同时满足以配置文件redis.conf中相关集合元素数量阈值与元素大小阈值两个条件,使用的就是压缩列表zipList,只要有一个条件不满足使用的就是跳跃列表skipList。例如,对于ZSet集合中这两个条件如下:
  • コレクション要素の数が redis.conf の zset-max-ziplist-entries 属性の値より少なく、そのデフォルト値は 128 です
  • 各コレクション要素のサイズは、redis.conf の zset-max-ziplist-value 属性の値より小さく、デフォルト値は 64 バイトです。

3.10.2 zipリスト

3.10.2.1 zipListとは

一般に圧縮リストと呼ばれる zipList は、文字列または整数を格納するために特別にエンコードされた二重リンク リストです。その基礎となるデータ構造は、先頭、エントリ、末尾の 3 つの部分で構成されます。これら 3 つの部分はメモリに連続して保存されます。

3.10.2.2 ヘッド

head又由三部分构成:
  • zlbytes: 4 バイト。zlbytes 自体の長さを含む、zipList リストのデータ構造全体が占めるバイト数を格納するために使用されます。
  • zltail: 4 バイト。データ構造全体の zipList の最後のエントリのオフセット (バイト) を格納するために使用されます。このデータが存在することにより、リストの最後尾のエントリ位置を素早く特定することができ、操作が容易になる。
  • zllen: 2 バイト。リストに含まれるエントリの数を格納するために使用されます。16 ビットしかないため、zipList に含めることができるエントリの最大数は 216-1 = 65535 です。

3.10.2.3 エントリ

entries是真正的列表,由很多的列表元素entry构成。由于不同的元素类型、数值的不同,从而导致每个entry的长度不同。
每个entry由三部分构成:
  • prevlength: この部分は、逆順のトラバーサルを実現するために前のエントリの長さを記録するために使用されます。デフォルトの長さは 1 バイトです。前のエントリの長さが 254 バイト未満である限り、prevlength は 1 バイトを占めますが、それ以外の場合は自動的に 3 バイトに拡張されます。
  • エンコーディング: この部分は、フラグの背後にある特定の種類のデータに使用されます。データが整数型の場合、1 バイトの固定長でエンコードされます。データが文字列型の場合、エンコード長は 1 バイト、2 バイト、または 5 バイトになります。データ文字列の長さが異なると、エンコード長も異なります。
  • データ: 実際に保存されているデータ。データ型は整数型または文字列型のみです。異なるデータは異なるバイト長を占めます。

3.10.2.4終了

end には zlend と呼ばれる部分のみが含まれます。1 バイトを占め、値は 255 に固定されます。つまり、バイナリ ビットはすべて 1 で、zipList リストの終わりを示します。

3.10.3 リストパック

ziplist の場合、実装が複雑です。逆順に移動するために、各エントリには前のエントリの長さが含まれるため、ziplist の途中でエントリを変更または挿入すると、カスケード更新が発生します。同時書き込み操作が多いシナリオでは、Redis のパフォーマンスが大幅に低下します。よりコンパクト、より高速な解析、よりシンプルな実装を実現するために、ziplist の実装が書き直され、listPack という名前が付けられました。
Redis 7.0 では、すべての zipList が listPack に置き換えられましたが、互換性のために、zipList の関連属性も構成に保持されます。

3.10.3.1 listPack とは

listPack は、文字列または整数を格納するための特別にエンコードされた二重リンク リストでもあります。その基礎となるデータ構造も、先頭、エントリ、末尾の 3 つの部分で構成されており、これら 3 つの部分もメモリに継続的に格納されます。
listPackとzipListの大きな違いはheadと各エントリの構造にあり、リストの終わりを示すendはzipListのzlendと同じで1バイトを占め、8ビットすべて1になります。

3.10.3.2 ヘッド

頭は 2 つの部分で構成されます。

  • totalBytes: 4 バイト。totalBytes 自体の長さを含む、listPack リストのデータ構造全体が占めるバイト数を格納するために使用されます。
  • elemNum: 2 バイト。リストに含まれるエントリの数を格納するために使用されます。意味は zipList の zllen と同じです。

zipList の head と比較すると、最後のエントリのオフセットを記録する zltail がありません。

3.10.3.3 エントリ

entries也是listPack中真正的列表,由很多的列表元素entry构成。由于不同的元素类型、数值的不同,从而导致每个entry的长度不同。但与zipList的entry结构相比,listPack的entry结构发生了较大变化。
其中最大的变化就是没有了记录前一个entry长度的prevlength,而增加了记录当前entry长度的element-total-len。而这个改变仍然可以实现逆序遍历,但却避免了由于在列表中间修改或插入entry时引发的级联更新。
每个entry仍由三部分构成:
  • エンコーディング: この部分は、フラグの背後にある特定の種類のデータに使用されます。データが整数型の場合、エンコード長は 1、2、3、4、5、または 9 バイトになります。バイト長が異なれば、識別ビットも異なります。データが文字列型の場合、エンコード長は 1、2、または 5 バイトになります。データ文字列の長さが異なると、エンコード長も異なります。
  • データ: 実際に保存されているデータ。データ型は整数型または文字列型のみです。異なるデータは異なるバイト長を占めます。
  • element-total-len: この部分は、逆順トラバーサルの現在のエントリの長さを記録するために使用されます。特殊な記録方法により、記録されるバイト データは 1、2、3、4、または 5 バイトになります。

3.10.4 シップリスト

3.10.4.1 スキップリストとは

スキップリスト、スキップリストと呼ばれるスキップリストは、実装が簡単で検索効率が高い、並列リンクリストに基づくランダム化されたデータ構造です。簡単に言えば、ジャンプリストもリンクリストの一種ですが、リンクリストにジャンプ機能を追加したものです。要素検索の効率化もこのジャンプ機能によって実現されます。

3.10.4.2 スキップリストの原則

先頭ノードと末尾ノードを持つ順序付きリンク リストがあるとします。

このリンクされたリストで、特定のデータを見つけたい場合は、そのデータを含むノードが見つかるまで、または指定されたデータより大きい最初のノードを見つけるか、最後の終了ノードを見つけるまで、最初から 1 つずつ比較する必要があります。 、後の 2 つはすべて見つかりません。同様に、新しいデータを挿入する場合は、同じ検索プロセスを実行して挿入位置を決定する必要があります。
検索効率を向上させるために、偶数ノードには次の偶数ノードを指すポインタが追加されます。

このようにして、すべての偶数番号のノードが新しいリンク リスト (上位リンク リストと呼ばれます) に接続されます。もちろん、上位リンク リストに含まれるノードの数は、元のリンク リストの半分にすぎません。リスト。このとき、あるデータを検索したいときは、まず上位リンクリストに沿って検索します。検索対象のデータより大きい最初のノードに遭遇した場合は、すぐにその大きいノードの前のノードから元の連結リストに戻って検索します。たとえば、データ 20 を挿入する場合は、まず (8、19、31、42) のリンク リストを検索し、20 より大きい最初のノード 31 を見つけてから、前のノード 31 を検索します。高レベルのリンク リスト 19 を取得し、元のリンク リストの次のノード値 23 を取得します。が 20 より大きい場合は、19 ノードと 23 ノードの間に 20 を挿入します。挿入が 25 (ノード 23 よりも大きい) の場合、ノード 23 とノード 31 の間に挿入されます。
この方法により、明らかに比較回数が減り、検索効率が向上します。連結リスト内の要素が多い場合、検索効率をさらに向上させるために、元の連結リストを 3 層の連結リスト、またはより上位の連結リストとして構築することができます。

レベルが高いほど検索効率が高くなります。

3.10.4.3 問題点

このリンクリストを階層的にリンクする方法は、原理的には検索効率が向上しますが、実際の運用では問題があり、固定通し番号の要素はレベルが固定されているため、リスト要素を追加または削除すると、リスト要素の追加や削除が行われてしまい、リストの要素レベル全体を大幅に調整することになりますが、これによりシステムのパフォーマンスが大幅に低下することは避けられません。
たとえば、リンク リストが 2 つのレベルに分かれている場合、奇数番号のノードが上位のリンク リスト、偶数番号のノードが下位のリンク リストであると指定できます。3 つのレベルに分割されたリンク リストの場合、ノードのシリアル番号と 3 のモジュロ結果に従って分割できます。ただし、新しいノードが挿入されたり、元のノードが削除された場合、元の階層分割ルールに従って階層が再分割されるため、システムのパフォーマンスが大幅に低下します。

3.10.4.4 アルゴリズムの最適化

前述の問題を回避するために、skipList ではレベルをランダムに割り当てる方法が採用されています。つまり、合計レベルが決定された後は、新しい要素が追加されるたびに、レベルがランダムに割り当てられます。このランダム性により、ノードのシリアル番号とレベル間の固定関係の問題が解決されます。

上の図は、リストの生成中に各要素にレベルをランダムに割り当てるプロセスを示しています。このスキップリストの作成と挿入のプロセスから、各ノードのレベル数がランダムに割り当てられ、ノードの新規挿入は他のノードのレベル数に影響を与えないことがわかります。多くのノードを調整することなく、挿入されたノードの前後のポインタを変更するだけで済みます。これにより、挿入操作の複雑さが軽減されます。
SkipList は、下位 1 のリンク リストに加えて、複数の層のスパース リンク リストを生成することを指します。これらのリンク リスト内のポインタは一部のノードをスキップし、リンク リストのレベルが高くなるほど、より多くのノードがスキップされます。データを検索するときは、最初に上位レベルのリンク リスト内で検索し、次にレイヤーごとに下位レベルに移動し、最後に第 1 レベルのリンク リストにドロップしてデータの場所を正確に特定します。この処理では一部のノードがスキップされるため、検索速度が高速化されます。

3.10.5 クイックリスト

3.10.5.1 クイックリストとは

QuickList、クイック リスト、quickList 自体は双方向の非循環リンク リストであり、その各ノードは zipList です。Redis3.2 バージョン以降、List の基になる実装には、zipList と linkedList の代わりに QuickList が使用されます。
zipList と linkedList には明らかな欠点がありますが、quickList はそれらを改善し、zipList と linkedList の利点を吸収して欠点を回避します。
QuickList は本質的に zipList と linkedList のハイブリッドです。linkedList をセグメントに分割し、各セグメントは zipList を使用して複数の実データ要素をコンパクトに格納し、複数の zipList は双方向ポインタを使用して直列に接続されます。もちろん、各 zipList に保存できるデータ要素の最大容量は、list-max-ziplist-size 属性を通じて構成ファイルで指定できます。

3.10.5.2 取得操作

QuickList の動作原理をより深く理解するために、検索、挿入、削除などの操作の実装を分析することで理解を深めます。
List 要素の取得は、そのインデックスインデックスに基づいて行われます。QuickList は zipList を 1 つずつ並べて構成されており、各 zipList の zllen には現在の zipList に含まれるエントリの数、つまり含まれる実際のデータ要素の数が記録されます。取得する要素のインデックスに従って、quickList の先頭ノードから zipList の zllen を 1 つずつ合計し、その合計がインデックスより大きい最初の zipList が見つかるまで、取得する要素はこの zipList にあります。

3.10.5.3 挿入操作

由于zipList是有大小限制的,所以在quickList中插入一个元素在逻辑上相对就比较复杂一些。假设要插入的元素的大小为insertBytes,而查找到的插入位置所在的zipList当前的大小为zlBytes,那么具体可分为下面几种情况:
  • ケース 1: insertBytes + zlBytes <= list-max-ziplist-size の場合、zipList 内の対応する位置に直接挿入します。
  • ケース 2: insertBytes + zlBytes > list-max-ziplist-size で、挿入位置が zipList の先頭の場合、zipList の前の zipList のサイズ prev_zlBytes を確認する必要があります。
  • insertBytes + prev_zlBytes<= list-max-ziplist-size の場合、前の zipList の最後に要素を直接挿入します。
  • insertBytes + prev_zlBytes> list-max-ziplist-size の場合、要素自体を新しい zipList に直接構築し、quickList に接続します。
  • ケース 3: insertBytes + zlBytes > list-max-ziplist-size で、挿入位置が zipList の最後にある場合、zipList の次の zipList のサイズ next_zlBytes を確認する必要があります。
  • insertBytes + next_zlBytes<= list-max-ziplist-size の場合、次の zipList の先頭位置に要素を直接挿入します。
  • insertBytes + next_zlBytes> list-max-ziplist-size の場合、要素自体を新しい zipList に直接構築し、quickList に接続します。
  • 状況 4: insertBytes + zlBytes > list-max-ziplist-size で、挿入位置が zipList の途中にある場合、現在の zipList を 2 つの zipList に分割し、それらを QuickList に接続し、要素をその前に挿入します。分割 zipList の末尾の位置

3.10.5.4 削除操作

削除操作の場合、対応する zipList で要素が削除された後、zipList にまだ要素が存在するかどうかに注意するだけで済みます。他に要素がない場合は、zipList を削除し、その前後の 2 つの zipList を接続します。

3.10.6 キーと値の要素数

上で説明した Redis のさまざまな特殊なデータ構造の設計により、Redis のパフォーマンスが大幅に向上するだけでなく、Redis がサポートできるキーの数と設定値でサポートできる要素の数も非常に多くなります。

  • Redis は最大 232 キー (約 42 億) を処理でき、各 Redis インスタンスが少なくとも 2 億 5,000 万のキーを処理できることが実際にテストされています。
  • 各 Hash、List、Set、ZSet コレクションには 232 個の要素を含めることができます。

3.11 ビットマップ操作コマンド

3.11.1 ビットマップの概要

BitMap は、Redis バージョン 2.2.0 で導入された新しいデータ型です。このデータ型は基本的に、0 と 1 のみを含むバイナリ文字列です。それに関連するコマンドはすべて、この文字列のバイナリ ビットに対する操作です。文字列を記述するために使用される属性は、key、offset、bitValue の 3 つです。

  • key: BitMap は Redis のキーと値の Value データ型であるため、Value には対応するキーが必要です。
  • offset: 各 BitMap データは文字列であり、文字列内の各文字には 0 からカウントされる対応するインデックスがあります。インデックスは、ビットマップ内の各文字のオフセットと呼ばれます。このオフセットの値の範囲は [0, 232-1] です。つまり、このオフセットの最大値は 4G-1、つまり 4294967295 で、42 億を超えます。
  • bitValue: 各 BitMap データは 0 と 1 のみを含むバイナリ文字列であり、各オフセット ビットの文字はビットの値 bitValue と呼ばれます。bitValue の値は 0 または 1 です。

3.11.2 セットビット

  • 形式:SETBITキーオフセット値
  • 機能: 指定されたキーの BitMap データのオフセット位置の値を設定します。戻り値は変更前のオフセット位置のbitValueです。
  • 注: 元の BitMap 文字列に存在しないオフセットに値を割り当てると、指定されたオフセットに値を格納できるように文字列が自動的に引き伸ばされます。文字列値が引き伸ばされると、空の位置は 0 で埋められます。もちろん、設定値は 0 または 1 のみです。ただし、大きなオフセットを使用する SETBIT 操作の場合、メモリ割り当てプロセスにより Redis サーバーがブロックされる可能性があることに注意してください。

3.11.3 ゲットビット

形式: GETBIT キー オフセット
機能: キーに格納されている BitMap 文字列値について、指定されたオフセット offset のビット値 bitValue を取得します。
説明: オフセットが文字列値の長さより大きい場合、またはキーが存在しない場合は、 0 を返します。

3.11.4 ビット数

  • 形式: BITCOUNT キー [開始] [終了]
  • 機能: 指定された文字列内で 1 に設定されたビットの数を数えます。一般に、統計の範囲は、指定された BitMap 文字列全体です。ただし、追加の開始パラメータまたは終了パラメータを指定して、開始と終了を含む、指定されたバイト範囲内の文字列のみをカウントすることもできます。ここでの開始と終了の単位はビットではなくバイトであり、0 からカウントされることに注意してください。
  • 注: start パラメータと end パラメータはどちらも負の値を使用できます。-1 は最後のバイトを意味し、-2 は最後から 2 番目のバイトを意味します。さらに、存在しないキーは空の文字列として扱われるため、存在しないキーに対して BITCOUNT 演算が実行され、結果は 0 になります。

3.11.5ビット

  • 形式: BITPOS キービット [開始] [終了]
  • 機能: key で指定された BitMap 内の、値が指定された値ビット (0 または 1 ではない) である最初のバイナリ ビットの位置を返します。pos、つまり位置、位置。デフォルトでは、このコマンドはビットマップ全体を検出しますが、オプションの開始パラメータと終了パラメータを使用して、検出する範囲を指定することもできます。
  • 注: start と end の意味は、bitcount コマンドの意味と同じです。

3.11.6 ビトップ

  • 形式:BITOP操作デスクキーキー[キー…]
  • 機能: 1 つ以上の BitMap 文字列キーに対してバイナリ演算を実行し、結果を destkey に保存します。
  • 演算は、AND、OR、NOT、XOR の 4 つの演算のいずれかになります。
  • BITOP AND destkey key [key …] : 1 つ以上の BitMap に対してビットごとの AND 演算を実行し、結果を destkey に保存します。
  • BITOP OR destkey key [key …] : 1 つ以上の BitMap に対してビットごとの OR 演算を実行し、結果を destkey に保存します。
  • BITOP XOR destkey key [key …] : 1 つ以上の BitMap に対してビットごとの XOR 演算を実行し、結果を destkey に保存します。
  • BITOP NOT destkey key: 指定された BitMap に対してビット単位の NOT 演算を実行し、結果を destkey に保存します。
  • 例証します:
  • NOT 演算を除いて、すべての演算は 1 つ以上の BitMap を入力として受け入れることができます。
  • NOT 演算を除いて、ビットマップ上の他の演算は実際にはコピーです。
  • 演算に関与する複数の BitMap の長さが異なる場合、短い BitMap は補助ビットとして 0 を使用して長い BitMap を演算し、演算結果の長さは長い BitMap と同じになります。

3.11.7 アプリケーションシナリオ

オフセットの値の範囲が広いため、一般に、大量のデータのバイナリ統計に適用されます。たとえば、プラットフォームのアクティブ ユーザー統計 (バイナリ: 訪問かどうか)、サポート率統計 (バイナリ: サポートかどうか)、従業員の勤怠統計 (バイナリ: 勤務中または非勤務)、画像の二値化 (バイナリ: 黒または白) などです。
ただし、データ量が少ないバイナリ統計の場合、BitMap には適していないため、Set を使用する方が適切な場合があります。もちろん、特定量のデータは Set の使用に適しており、超過データは特定のシナリオに応じた特定の分析が必要な BitMap の使用に適しています。
たとえば、プラットフォームは毎日のアクティブ ユーザーの数をカウントしたいとします。
Set を使用してカウントする場合は、オンラインにアクセスしてそのユーザー ID を Set コレクションに書き込むだけでよく、最後に Set コレクション内の要素の数をカウントするだけで統計を完了できます。つまり、Set コレクションが占有するメモリのサイズは、オンライン ユーザーの数に比例します。ユーザー ID が m ビットで、アクティブなユーザーの数が n であると仮定すると、セットのサイズは少なくとも m n バイトでなければなりません。
統計に BitMap を使用する場合は、最初に BitMap を定義する必要があります。BitMap が占有するビットは、少なくとも登録ユーザーの数です。オンラインに接続する必要があるユーザーは 1 人だけで、ビット位置の 1 つがすぐに 1 に設定され、最後にビットマップ内の 1 の数を数えることで統計を完了できます。つまり、BitMap が占有するメモリのサイズは登録ユーザーの数に比例し、オンライン ユーザーの数とは関係ありません。プラットフォーム上の登録ユーザーの数が N であると仮定すると、BitMap の長さは少なくとも N ビット、つまり N/8 バイトになります。
BitMap を使用するのがより適切なのはどのような場合ですか? m
n バイト = N/8 バイト、つまり n = N/8/m = N/(8 m) の場合、Set コレクションが占めるメモリ サイズは BitMap のメモリ サイズと同じになります。タオバオを例にとると、ユーザー ID の長さは 11 桁 (m)、登録ユーザー数は 8 億人 (N) です。アクティブ ユーザー数が 8 億/(8 の場合)11) = 0900 万 = 9*106 = 900 万、Set と BitMap が占有するメモリは同じです。ただし、淘宝網の 1 日あたりの平均アクティブ ユーザー数は 8,000 万人であるため、淘宝網では BitMap を使用する方が適切です。

3.12 HyperLogLog運用コマンド

3.12.1 HyperLogLog の概要

HyperLogLog は、Redis バージョン 2.8.9 で導入された新しいデータ型で、ハイパーログ ログ、スーパー ログ レコードを意味します。このデータ型は、要素が文字列であるセット コレクションとして単純に理解できます。しかし、実際には、HyperLogLog はカーディナリティをカウントする確率アルゴリズムであり、これにより、独立した合計の統計を非常に少ないメモリで完了できます。関連するコマンドはすべて、この「セット コレクション」に対する操作です。

3.12.2 パス付き

  • 形式: PFADD キー要素 [要素 ...]
  • 機能: 指定された HyperLogLog コレクションに任意の数の要素を追加します。内部ストレージが変更された場合は 1 を返し、変更されていない場合は 0 を返します。

3.12.3 pfcount

  • 形式: PFCOUNT キー [キー ...]
  • 機能: このコマンドが単一のキーに作用する場合、指定されたキーの HyperLogLog コレクションのおおよそのカーディナリティが返されます。このコマンドが複数のキーに作用する場合、指定されたキーのすべての HyperLogLog コレクションの和集合のおおよそのカーディナリティが返されます。 ; キーが存在しない場合は 0 を返します。

3.12.4 pfmerge

  • 形式:PFMERGE destkey sourcekey [sourcekey …]
  • 機能: 複数の HyperLogLog コレクションを 1 つの HyperLogLog コレクションにマージし、それを destkey に保存します。マージされた HyperLogLog のカーディナリティは、すべてのsourcekey HyperLogLog コレクションの和集合に近くなります。

3.12.5 アプリケーションシナリオ

HyperLogLog は、非常に大きなログ データに対して不正確な重複除外カウント統計を実行する可能性があります。もちろん、この不正確さに対して Redis が示す公式誤差は 0.81% です。このエラーは、大規模なデータ ボリュームのほとんどのシナリオで許容されます。プラットフォーム上の各ページの毎日の UV データの記録には、HyperLogLog を使用するのが非常に適しています。

3.13 地理空間操作コマンド

3.13.1 地理空間の概要

地理空間、地理的空間。
Redis は、バージョン 3.2 で新しいデータ型である地理空間を導入しました。この型も本質的にはコレクションですが、コレクション要素は特別で、3 つの部分から構成されるデータ構造です。このデータ構造は空間要素と呼ばれます。

  • 経度:経度。有効な経度は [-180, 180] です。正は東経、負は西経を意味します。
  • 緯度: 緯度。有効な緯度は [-85.05112878, 85.05112878] です。正は北緯を示し、負は南緯を示します。
  • 場所名: 緯度と経度でマークされた場所に付けられた名前。地理空間コレクションの空間要素名とも呼ばれます。

このタイプを通じて、地理的位置の緯度と経度を設定およびクエリしたり、特定の範囲内の空間要素をクエリしたり、2 つの空間要素間の距離を計算したりすることができます。

3.13.2 地理追加

  • 格式:GEOADDキー経度緯度メンバー[経度緯度メンバー…]
  • 機能: 1 つ以上の空間要素を指定された空間コレクションに追加します。
  • 説明: ユーザーが範囲外の経度または緯度を入力しようとすると、このコマンドはエラーを返します。

3.13.3 ジオポス

  • 形式: GEOPOS キーメンバー [メンバー ...]
  • 機能: 指定された地理空間から指定された要素の位置、つまり緯度と経度を返します。
  • 注: このコマンドは可変数の要素を入力として受け入れるため、ユーザーが要素を 1 つだけ指定した場合でも、コマンドは配列を返します。

3.13.4 測地距離

  • 形式: GEODIST キー メンバー 1 メンバー 2 [単位]
  • 機能: 指定された 2 つの位置間の距離を返します。ここで、単位は次の単位のいずれかである必要があります。
  • m : メートル、デフォルト
  • km: キロメートル
  • ミ:マイル
  • フィート: フィート
  • 説明: 2 つの場所のいずれかが存在しない場合、コマンドは null 値を返します。さらに、距離の計算では地球が完全な球形であると仮定しており、極端な場合、この仮定により最大 0.5% の誤差が生じます。

3.13.5 ジオハッシュ

  • 形式: GEOHASH キーメンバー [メンバー ...]
  • 機能: 1 つ以上の位置要素の Geohash 値を返します。
  • 説明: GeoHash はアドレス エンコード方式です。彼は、2 次元の空間経度および緯度データを文字列にエンコードできます。この値は主に低レベルのアプリケーションまたはデバッグに使用され、実際にはほとんど影響しません。

3.13.6 地理半径

  • 格式:GEORADIUS キー経度緯度半径 m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT カウント]
  • 機能: 指定された緯度経度を中心として、指定された地理空間に含まれるすべての位置要素のうち、中心からの距離が指定された半径を超えない要素を返します。追加情報も返送時に持ち込むことができます。
  • WITHDIST : 位置要素を返すときに、位置要素と中心の間の距離も返します。距離の単位は、ユーザーが指定した距離の単位と一致します。
  • WITHCOORD : location 要素の経度と寸法も返されます。
  • WITHHASH: 位置要素の Geohash も返されますが、このハッシュは整数形式で表現されます。

コマンドはデフォルトでソートされていない位置要素を返します。次の 2 つのパラメータを使用して、ユーザーは返された位置要素の並べ替え方法を指定できます。

  • ASC : 中心の位置に応じて、近いところから遠いところまでの途中の位置要素を返します。
  • DESC : 中心の位置に従って、位置要素を最も遠いものから最も近いものまで返します。
  • 説明: デフォルトでは、このコマンドは一致するすべての位置要素を返します。ユーザーは COUNT オプションを使用して最初の N 個の一致要素を取得できますが、非常に広い領域を検索する場合は、少数の要素を取得するために COUNT オプションを使用した場合でも、コマンドは一致したすべての要素を内部で処理する必要がある場合があります。コマンドの実行が非常に遅くなる場合もあります。

3.13.7 メンバーによる地理的半径

  • 格式:GEORADIUSBYMEMBER キーメンバー半径 m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
  • 機能: このコマンドは、指定された範囲内の要素を見つけることができる GEORADIUS コマンドと同じですが、このコマンドの中心点は、入力経度と緯度を使用して中心を指定するのではなく、位置要素形式によって与えられます。 GEORADIUSのようなポイント。
  • 説明: 返された結果には、中心点の位置の要素も含まれています

3.13.8 アプリケーションシナリオ

Geospatial の意味は地理的な位置であるため、主に地理的な位置に関連する計算が適用されます。たとえば、WeChat ディスカバリーの「近く」機能、友達追加の「レーダープラス友達」機能、QQ ダイナミクスの「近く」機能、DingTalk の「チェックイン」機能などです。

3.14 パブリッシュ/サブスクライブコマンド

3.14.1 メッセージシステム


パブリッシュ/サブスクライブ、またはパブリッシュ/サブスクライブはメッセージ通信モードです。メッセージ プロデューサとも呼ばれるパブリッシャはメッセージを作成してストレージ システムに送信し、サブスクライバはメッセージ コンシューマとも呼ばれ、ストレージ システムからメッセージを受信して​​消費します。このストレージ システムには、ファイル システム FS、メッセージ ミドルウェア MQ、データ管理システム DBMS、または Redis を使用できます。メッセージ パブリッシャー、サブスクライバー、およびストレージ システム全体をメッセージ システムと呼びます。
メッセージ システムのサブスクライバが特定のタイプのメッセージをサブスクライブした後は、そのタイプのメッセージがストレージ システムに存在する限り、これらのメッセージを継続的に受信して消費できます。ストレージ システムにそのようなメッセージが存在しない場合、サブスクライバの受信と消費はブロックされます。パブリッシャがメッセージをストレージ システムに書き込むと、サブスクライバはすぐに起動されます。ストレージ システムがいっぱいになると、パブリッシャーによって処理方法が異なります。パブリッシャーのパブリッシュをブロックして、利用可能なストレージ領域が空くまで待機するパブリッシャーもあれば、冗長メッセージを失うパブリッシャーもいます。
もちろん、メッセージ システムが異なれば、メッセージのパブリッシュ/サブスクライブの方法も異なります。たとえば、RocketMQ や Kafka などのメッセージング ミドルウェアで構成されるメッセージング システムでは、パブリッシュ/サブスクライブされたメッセージがトピックごとに分類されます。Redisで構成されるメッセージシステムでは、パブリッシュ/サブスクライブメッセージはチャネルごとに分類されます。

3.14.2 購読する

  • 形式: SUBSCRIBE チャンネル [チャンネル ...]
  • 機能: Redis クライアントは、subscribe コマンドを通じて同時に任意の数のチャネルにサブスクライブできます。サブスクライブされたトピックを出力した後、コマンドはブロックされ、関連するチャネルからのメッセージを待ちます。

3.14.3 サブスクライブ

  • 形式: PSUBSCRIBE パターン [パターン ...]
  • 機能: 指定されたパターンに一致する 1 つ以上のチャネルを購読します。
  • 注: ここのパターンではワイルドカードのみを使用できます たとえば、  it.news、it.blog、it.tweets など、it で始まるすべてのチャネルと一致します。news.* は、news.global.today、news.it など、news. で始まるすべてのチャネルと一致します。 、など。

3.14.4 公開する

  • 形式: PUBLISH チャネルメッセージ
  • 機能: Redis クライアントは、publish コマンドを通じてチャネル メッセージを公開できます。戻り値は、メッセージを受信したサブスクライバーの数です。

3.14.5 購読解除

  • 形式: UNSUBSCRIBE [チャンネル [チャンネル ...]]
  • 機能: Redis クライアントは、指定されたチャネルからサブスクライブを解除します。
  • 注: チャネルが指定されていない場合、つまりパラメータなしで UNSUBSCRIBE コマンドが実行された場合、クライアントが SUBSCRIBE コマンドを使用して登録したすべてのチャネルが登録解除されます。この場合、コマンドは、未登録のすべてのチャネルをクライアントに通知するメッセージを返します。

3.14.6 ダジャレサブスクライブ

  • 形式: PUNSUBSCRIBE [パターン [パターン ...]]
  • 機能: 指定されたパターンに一致する 1 つ以上のチャネルから購読を解除します。
  • 注: ここのパターンではワイルドカード * のみを使用できます。チャネルが指定されていない場合、効果は SUBSCRIBE コマンドと同じであり、クライアントは購読されているすべてのチャネルから購読を解除します。

3.14.7 パブサブ

  • 形式: PUBSUB [引数 [引数 ...]]
  • 機能: PUBSUB は、サブスクリプションの表示とシステム ステータスの公開を行うためのイントロスペクション コマンド セットです。さまざまな形式のいくつかのサブコマンドで構成されています。これらのサブコマンドの使用法を以下に紹介します。

3.14.7.1 pubsub チャネル

  • フォーマット: PUBSUB CHANNELS [パターン]
  • 機能: 現在アクティブなチャネルをすべてリストします。アクティブなチャネルとは、少なくとも 1 人の加入者がいるチャネルです。
  • 注: pattern パラメータはオプションです。パターン引数が指定されていない場合は、サブスクライブ/パブリッシュ システム内のすべてのアクティブなチャネルがリストされます。pattern 引数が指定された場合、指定されたパターンに一致するアクティブなチャネルのみがリストされます。パターンではワイルドカード * のみを使用できます。

3.14.7.2 pubsub numsub

  • 形式: PUBSUB NUMSUB [チャネル 1 … チャネル N]
  • 機能: 指定されたチャンネルの加入者数を返します。チャネルが指定されていない場合は、空のリストを返します。

3.14.7.3 パブサブの家賃

  • フォーマット: PUBSUB NUMPAT
  • 機能: 現在のすべての Redis クライアントによってサブスクライブされているすべてのチャネル モードの数の合計をクエリします。

3.15 Redis トランザクション

Redis トランザクションの本質は、一連のコマンドのバッチ処理です。このグループのコマンドは、実行中に一度に順番に実行されます。構文エラーがない限り、このグループのコマンドは実行中に中断されません。

3.15.1 Redis トランザクション機能

Redis トランザクションはデータの整合性のみを保証し、DBMS と同じ ACID 特性を持ちません。

  • このコマンド グループの一部のコマンドの実行が失敗しても、他のコマンドの実行には影響せず、ロールバックも発生しません。つまり、それはアトミックではありません。
  • この一連のコマンドは、楽観的ロックによる単純な分離を実装します。複雑な分離レベルはありません。
  • このグループのコマンドの実行結果はメモリに書き込まれ、永続的かどうかは Redis の永続化戦略に依存し、トランザクションとは関係ありません。

3.15.2 Redis トランザクションの実装

3.15.2.1 3 つのコマンド

Redis トランザクションは 3 つのコマンドによって制御されます。

  • muti: オープントランザクション
  • exec: トランザクションを実行します
  • 破棄: トランザクションをキャンセルします

3.15.2.2 基本的な使い方

トランザクションの定義と実行の使用方法は次のとおりです。

トランザクションの実行後、トランザクションで定義された変数にアクセスし、その値が変更されます。

次に、トランザクションを定義して取り消す例を示します。

トランザクションが取り消された後、トランザクション内のコマンドは実行されません。

3.15.3 Redis トランザクション例外処理

3.15.3.1 構文エラー

トランザクション内のコマンドに構文エラーがある場合、実行中にトランザクション全体がキャンセルされます。

exec のヒントは、前のエラーのために exec が無視され、トランザクションがキャンセルされたということです。
この時点で、age の値にアクセスすると、まだ 19 であり、トランザクションで設定された 20 に変更されていないことがわかります。

3.15.3.2 実行例外

トランザクション内のコマンドに構文エラーがなくても、実行中に例外が発生した場合、その例外は他のコマンドの実行には影響しません。

上記のトランザクションの 2 番目のコマンドの実行中に例外が発生しました。スコアは整数ではないため、20 ずつ増やすことはできません。ただし、この例外は、その前後のコマンドの正しい実行には影響しません。スコアと名前の値を確認すると、正常に実行された結果であることがわかります。

3.15.4 Redis トランザクション分離メカニズム

3.15.4.1 分離メカニズムが必要な理由

同時シナリオでは、複数のクライアントが同じデータを変更する可能性があります。
たとえば、C left と C right という 2 つのクライアントがあり、C left は 40 リソースを申請する必要があり、C right は 30 リソースを申請する必要があります。彼らはまず、現在所有しているリソースの数、つまりリソー​​スの価値を調べました。表示されたのは 50 個だけでしたが、全員がリソースの数でニーズを満たすことができると感じたため、リソースを占有するためにリソースの数を変更しました。しかし、その結果、リソースは「売られすぎ」になります。

この状況を解決するために、Redis トランザクションはオプティミスティック ロック メカニズムによるマルチスレッドでの実行分離を実装します。

3.15.4.2 隔離の実装

Redis は、監視コマンドとトランザクションを通じてマルチスレッドでの実行分離を実装します。

上記 2 つのクライアントの実行の時系列は次のとおりです。

時間 C左 C右
T1 リソースを見る
T2 リソースを取得する リソースを取得する
T3 マルチ
T4 デクビーリソース 40
T5 デクビーリソース 30
T6 実行する

3.15.4.3 実装原則

その内部実行プロセスは次のとおりです。

  1. クライアントがキーの監視を実行すると、システムはキーにバージョンオプティミスティックロックを追加し、バージョンを初期化します。たとえば、初期値は 1.0 です。
  2. その後、クライアント C はキーの変更ステートメントをトランザクション コマンド キューに書き込み、実行されませんでしたが、キーの値とバージョンを読み取り、現在のクライアント キャッシュに保存しました。このとき、バージョン1.0の初期値を読み込んで保存します。
  3. その後、クライアントCは、キーの値を変更するが、この変更は、キー自体の値を変更するだけでなく、バ​​ージョンを2.0に変更するなど、バージョンの値を増加させ、キー情報にバージョンを記録する。 . .
  4. その後、クライアント C は exec を実行し、トランザクション内のコマンドの実行を開始します。ただし、キーを変更するコマンドを実行すると、コマンドはまず、現在のクライアント キャッシュに保存されているバージョン値と現在のキー情報のバージョン値を比較します。キャッシュ バージョンがキー バージョンより小さい場合、クライアントによってキャッシュされたキーの値が古いことを意味し、書き込み操作が実行されるとデータの一貫性が破壊される可能性があります。したがって、書き込み操作は実行されません。

おすすめ

転載: blog.csdn.net/f5465245/article/details/130869341