ホームページ  >  記事  >  バックエンド開発  >  Redis チュートリアル (3): リスト データ型

Redis チュートリアル (3): リスト データ型

黄舟
黄舟オリジナル
2016-12-28 14:28:331383ブラウズ

1. 概要:

Redis では、List タイプは挿入順にソートされた文字列のリンクされたリストです。データ構造内の通常のリンク リストと同様に、その先頭 (左) と末尾 (右) に新しい要素を追加できます。挿入中にキーが存在しない場合、Redis はキーの新しいリンク リストを作成します。対照的に、リンクされたリスト内のすべての要素が削除されると、キーもデータベースから削除されます。リストに含めることができる要素の最大数は 4294967295 です。
要素の挿入と削除の効率の観点から、リンク リストの両端で要素を挿入または削除すると、リンク リストに数百万のレコードが格納されている場合でも、この操作は非常に効率的になります。一定時間内に完了しました。ただし、要素の挿入または削除操作がリンク リストの途中で実行されると、非常に非効率になることに注意してください。これは、優れたデータ構造の基盤を持つ開発者にとっては理解するのが難しいことではないと思います。

2. 関連コマンドリスト:


LINDEX キー インデックス O(N)N は、要素を見つけるときに走査する必要がある要素の数を表します。先頭要素または末尾要素の場合、その時間計算量は O(1) です。このコマンドは、リンクされたリスト内の指定された位置 (インデックス) にある要素を返します。インデックスは 0 から始まり、インデックスが -1 の場合は末尾要素を意味します。キーがリンク リストに関連付けられていない場合、このコマンドは関連するエラー情報を返します。 リクエストされた要素を返すか、インデックスが範囲外の場合は nil を返します。 LTRIMkey start stop O(N)Nは削除された要素の数を表します。このコマンドは、指定された範囲内の要素のみを保持するため、リンク内の要素の数は比較的一定に保たれます。 start パラメータと stop パラメータはどちらも 0 ベースで、0 はヘッダー要素を示します。他のコマンドと同様に、start と stop には負の値を指定することもでき、-1 は末尾要素を表します。 start がリンク リストの末尾より大きい場合、または start が stop より大きい場合、このコマンドはエラーを報告しませんが、空のリンク リストを返し、キーは同時に削除されます。 stop が要素の数より大きい場合、start からの残りの要素はすべて保持されます。
コマンドプロトタイプ 時間計算量 コマンド説明 戻り値
LPUSHkey値[value ...] O(1) 指定されたKeyに関連付けられたList Valueの先頭パラメータで指定されたすべての値を挿入します。キーが存在しない場合、このコマンドは挿入前にキーに関連付けられた空のリンク リストを作成し、リンク リストの先頭からデータを挿入します。キーの値がリンク リスト タイプでない場合、このコマンドは関連するエラー情報を返します。 挿入後のリンクリスト内の要素の数。
LPUSHX キーの値 O(1) パラメーターで指定されたキーが存在する場合のみ、このコマンドはパラメーターで指定された値を関連するリスト値の先頭に挿入します。それ以外の場合は何も行われません。行われる。 挿入後のリンクリスト内の要素の数。
LRANGEキー start stop O(S+N) 時間計算量のSはstartパラメータで表されるオフセット、Nは要素数を表します。このコマンドのパラメータ start と end はどちらも 0 から始まります。つまり、0 はリンク リストの先頭 (左端) の最初の要素を表します。 start の値は負の値にすることもできます。-1 はリンクされたリストの最後の要素、つまり末尾の要素を表し、-2 は最後から 2 番目の要素を表し、以下同様になります。このコマンドで要素を取得すると、開始位置と終了位置の要素も取り出されます。 start の値がリンク リスト内の要素の数より大きい場合、空のリンク リストが返されます。 end の値が要素の数より大きい場合、このコマンドは、start から始まるリンク リスト内の残りの要素をすべて取得します (start を含む)。 指定された範囲内の要素のリストを返します。
LPOPkey O(1) 指定されたKeyに関連付けられたリンクリストの最初の要素、つまりhead要素を返し、ポップアップします。キーが存在しない場合は nil を返します。 リンクされたリストの先頭の要素。
LLENkey O(1) 指定されたキーに関連付けられたリンクリスト内の要素の数を返します。キーが存在しない場合は、0 が返されます。キーに関連付けられた値のタイプがリンク リストではない場合、関連するエラー情報が返されます。 リンクリストの要素数
時間計算量におけるLREMkeyカウント値 O(N) Nは、リンクリストの要素数を表します。指定されたキーに関連付けられたリンク リストで、値が value に等しい最初の count 要素を削除します。 count が 0 より大きい場合は、最初から最後まで走査して削除します。 count が 0 より小さい場合は、終端から最初まで走査して削除します。 count が 0 に等しい場合、リンクされたリスト内の value に等しいすべての要素を削除します。指定したKeyが存在しない場合は、直接0を返します。 削除された要素の数を返します。時間計算量における
LSETkeyインデックス値 O(N) Nは、リンクされたリスト内の要素の数を表します。ただし、先頭要素または末尾要素を設定する場合の時間計算量は O(1) です。リンクされたリスト内の指定された位置の値を新しい値に設定します。0 は最初の要素、つまり先頭要素を表し、-1 は末尾要素を表します。インデックス値 Index がリンク リスト内の要素の数を超える場合、このコマンドは関連するエラー情報を返します。時間計算量における
LINSERT キー BEFORE|AFTER ピボット値 O(N) 時間計算量では、N は要素ピボットを見つける前に走査する必要がある要素の数を表します。これは、ピボットがリンク リストの先頭または末尾にある場合、このコマンドの時間計算量は O(1) であることを意味します。このコマンドの機能は、ピボット要素の前後のパラメータに要素値を挿入することです。キーが存在しない場合、このコマンドは何も行いません。 Key に関連付けられた値の型がリンク リストではない場合、関連するエラー情報が返されます。 挿入が成功した後のリンクされたリスト内の要素の数。ピボットが見つからない場合は -1 が返され、キーが存在しない場合は 0 が返されます。
RPUSH key value [value ...] O(1) 指定されたKeyに関連付けられたList Valueの末尾にパラメータで指定されたすべてのValueを挿入します。キーが存在しない場合、このコマンドは、挿入前にキーに関連付けられた空のリンク リストを作成し、リンク リストの末尾からデータを挿入します。キーの値がリンク リスト タイプでない場合、このコマンドは関連するエラー情報を返します。 挿入後のリンクリストの要素数
RPUSHXキーの値 O(1) パラメータで指定されたKeyが存在する場合のみ、このコマンドは関連付けられたリストの末尾にパラメータを挿入します値 で指定された値。それ以外の場合、操作は行われません。 挿入後のリンクリスト内の要素の数。
RPOPkey O(1) 指定された Key に関連付けられたリンク リストの最後の要素、つまり末尾の要素を返し、ポップアップします。キーが存在しない場合は nil を返します。 リンクされたリストの最後にある要素。
RPOPLPUSH ソース宛先 O(1) ソースキーに関連付けられたリンクリストの末尾から要素を原子的にポップし、ポップされた要素を宛先キーに関連付けられたリンクリストの先頭に挿入します。ソースキーが存在しない場合、コマンドは nil を返し、他の操作は実行されません。ソースと宛先が同じキーの場合、関連付けられたリンク リストの末尾要素をリンク リストの先頭にアトミックに移動することと同じです。 ポップおよび挿入された要素を返します。

3。

5. RPUSH/RPUSHX/RPOP/RPOPLPUSH:
 /> redis-cli    #在Shell提示符下启动redis客户端工具。
    redis 127.0.0.1:6379> del mykey
    (integer) 1
    #mykey键并不存在,该命令会创建该键及与其关联的List,之后在将参数中的values从左到右依次插入。
    redis 127.0.0.1:6379> lpush mykey a b c d
    (integer) 4
    #取从位置0开始到位置2结束的3个元素。
    redis 127.0.0.1:6379> lrange mykey 0 2
    1) "d"
    2) "c"
    3) "b"
    #取链表中的全部元素,其中0表示第一个元素,-1表示最后一个元素。
    redis 127.0.0.1:6379> lrange mykey 0 -1
    1) "d"
    2) "c"
    3) "b"
    4) "a"
    #mykey2键此时并不存在,因此该命令将不会进行任何操作,其返回值为0。
    redis 127.0.0.1:6379> lpushx mykey2 e
    (integer) 0
    #可以看到mykey2没有关联任何List Value。
    redis 127.0.0.1:6379> lrange mykey2 0 -1
    (empty list or set)
    #mykey键此时已经存在,所以该命令插入成功,并返回链表中当前元素的数量。
    redis 127.0.0.1:6379> lpushx mykey e
    (integer) 5
    #获取该键的List Value的头部元素。
    redis 127.0.0.1:6379> lrange mykey 0 0
    1) "e"

IV. リンク リスト構造に関するヒント:


リンク リスト構造の価値について、Redis は公式ドキュメントでいくつかの実践的なヒントを提供しています。 RPOPLPUSHコマンドとして、以下に具体的に説明します。

Redis リンク リストは、複数のプログラム間のメッセージ交換を完了するためにメッセージ キュー サービスでよく使用されます。アプリケーションが LPUSH 操作を実行してリンク リストに新しい要素を追加するプログラムを通常「プロデューサー」と呼び、別のアプリケーションがリンク リストから要素を削除する RPOP 操作を実行するとします。プログラムは「コンシューマ」と呼ばれます。このとき、メッセージ要素を取り出した直後にコンシューマプログラムがクラッシュした場合、メッセージが取り出されて正常に処理されなかったために、メッセージが失われたと考えられ、ビジネスの損失につながる可能性があります。データの不整合やビジネスステータスの損失などの現象が発生します。ただし、RPOPLPUSH コマンドを使用すると、コンシューマ プログラムは、メイン メッセージ キューからメッセージを取得した後、メッセージをバックアップ キューに挿入し、その後、コンシューマ プログラムが通常の処理ロジックを完了するまで、バックアップ キューからメッセージを削除します。同時に、バックアップ キュー内のメッセージの有効期限が切れたことが判明した場合、そのメッセージをメイン メッセージ キューに戻すデーモン プロセスを提供し、他のコンシューマー プログラムが処理を継続できるようにすることもできます。 上記は Redis チュートリアル (3): リスト データ型です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。