プログラマの成長軌跡のRedis(5) -- ハッシュ型Redisデータ構造入門

まえがき
百度百科の文章を引用すると、ハッシュ値とは一般にハッシュ関数を通じて任意の長さの入力を固定長の出力に変換する値を指し、ハッシュ関数とは一般にハッシュ関数を指します。これに基づいて、java で hashMap データ型が生成されます。では、redis のハッシュ データ型とは何でしょうか? JavaのhashMapに似ているのでしょうか?

Redisのハッシュタイプとは何ですか?

Redis のハッシュ型は、 key { field1: value1, field2: value2, field3: value3 ....} で構成されます。
Redis のハッシュ型の実装構造は、リンクされたリストの配列である Java の hashMap と同じです。キーと値のペアの形式で保存され、理解しやすいように Java のクラスに例えることができます。Key はクラス名、field はメンバー変数名、value はメンバー変数の値です。たとえば、ユーザーのショッピング カート リストを保存したい場合、キーをユーザー ID、フィールドを製品 ID、値を製品の数量に設定して、小さなショッピング カートを形成できます。収納タイプ。

Redis のハッシュ型構造

ここに画像の説明を挿入
まずはjavaのハッシュマップデータ型について見ていきますが、その保存方法は以下の通りです。

  1. マッピング格納: ハッシュマッピング関数を使用して、キーに応じてハッシュテーブル内の位置を取得し、その位置に値がある場合、図のように連結リストの形で結合されます。最初はリンクリスト形式で保存されますが、リンクリストの長さが8の場合は赤黒ツリーに変換して保存し、検索・保存速度を向上させます。
    Ps: なぜ 8 なのでしょうか? これは、赤黒ツリーの平均検索長 (log(n)) と連結リストの平均検索長 (n/2) を重み付けした後に得られる値、つまり log( n) = n/2
  2. ハッシュ拡張: hashMap には通常 0.75 の充填係数があり、初期長は 16 ですが、これはハッシュ テーブルに少なくとも 12 (16*0.75) 個の位置がある場合に拡張することを意味します。拡張方法はさらに複雑で、jdk1.7を例にとると、hashMapオブジェクトが新規の場合、配列が初期化され、その容量は指定された容量以上の2のべき乗になります。次に、負荷率に基づいてしきい値が決定されます。最初の配置ではない場合、新しいアレイ容量 = 古いアレイ容量 * 2、新しいしきい値 = 新しいアレイ容量 * 負荷率になります。
    詳細については、プログラマーの成長パスのハッシュマップを参照してください。
    Redisのハッシュデータ型をもう一度見てみましょう。
  3. マッピング ストレージ: この保存方法はハッシュマップに似ており、データを「配列 + リンク リスト」の形式で保存します。ハッシュ配列上のデータが衝突すると、衝突した要素はリンクリストの形で接続されます。
  4. ハッシュ拡張: Java jdk1.7 バージョンでは、容量拡張時に元の配列のデータセットを新しい配列に入れるステップがあり、ここで再ハッシュ関数が関係します 詳細は成長パスのハッシュマップを参照してくださいプログラマーの。ただし、データセットの数が多い場合、再ハッシュは時間がかかる操作となり、ブロックされる可能性があります。したがって、redis は拡張メカニズム (プログレッシブ リハッシュ) を再設計する必要があります。
    なぜプログレッシブ・リハッシュと呼ばれるのでしょうか? 一度に完了する通常のリハッシュとは異なり、プログレッシブリハッシュは複数回に分けて徐々に完了します。この利点は、ハッシュ構造内のデータ量が多い場合にサービスの輻輳を回避できることです。
    リハッシュをトリガーする条件:
  5. 容量拡張
    a) Redis が現在 BGSAVE コマンドまたは BGREWRITEAOF コマンドを実行しておらず、ハッシュ テーブルの負荷係数 (ハッシュ テーブルに保存されているノード数 / ハッシュ テーブルのサイズ) が 1 以上である。
    b) Redis は現在 BGSAVE コマンドまたは BGREWRITEAOF コマンドを実行中であり、ハッシュ テーブルの負荷係数は 5 以上です。
    注: BGSAVEコマンドまたはBGREWRITEAOFコマンドを実行中に拡張を実行すると、メモリページが過剰に分離されます。
  6. 縮小 (負荷係数が 0.1 未満)
    プログレッシブ リハッシュの原則:
    1. プログレッシブ リハッシュでは、ht[0] (元のハッシュ構造) の容量の 2 倍のサイズの新しいスペースが割り当てられます [リハッシュには拡張が伴うことに注意してください] 、古いハッシュ構造と新しいハッシュ構造を保存します。これらはそれぞれ ht[0] と ht[1] として記録されます。ht[0] が古いハッシュ構造で、ht[1] が新しいハッシュ構造です。
    2. 添字カウンタ rebashidx を設定し、0 に初期化し、再ハッシュ操作の準備をします。図 3 に示すように
    ここに画像の説明を挿入
    、redis の追加、削除、変更、クエリ操作が実行されるたびに、ht[0] の rehashinx インデックス内のリンク リスト上のすべてのデータが ht[0].size + rehashinx に移行されます。 ht[1] テーブルの場所。詳細については、ハッシュマップ拡張メカニズムを参照してください。次に、rebashidx の値に 1 を追加して、移行する次のリンク リストを指します。以下に示すように。さらに、命令がアイドル状態の場合、redis には辞書を自動的に再配置するスケジュールされたタスクも含まれます。
    ここに画像の説明を挿入
    4. rebashidx == ht[0].size の場合は、ht[0] のデータがすべて ht[1] に移動されたことを意味しますので、このとき、rebashidx を -1 に設定します。

プログレッシブリハッシュのプロセスにおける Redis の追加、削除、変更、およびクエリ:

  1. データの追加: ht[1] にデータを直接追加し、 ht[0] のデータが時間内に ht[1] に移行できないという問題を回避します。
  2. 削除、更新、およびクエリ: 辞書の削除、検索、更新などの操作は、2 つのハッシュ テーブルに対して実行されます。最初に ht[0] でクエリを実行し、見つからない場合は、次に ht[1] でクエリを実行します。

ハッシュデータ構造の長所と短所

アドバンテージ:

  1. 構造化されたデータを格納するのに便利で、string型のようにオブジェクト全体をシリアライズしてから格納する必要がないため、オブジェクトストレージに適しています。
    欠点:
  2. 文字列型に比べてストレージのオーバーヘッドが大きくなります。

一般的なハッシュコマンド

  1. Hset キー フィールド値 // 構造化データを格納
  2. Hmset key field1 value1【field2 value2 ...】 //構造化データを格納
  3. Hget key field // 特定の構造化データの属性値を取得
  4. Hgetall key // 構造化データ内のすべての属性 + 属性値を取得
  5. Hlen キー // 長さを取得する

Redis のインストール
https://blog.csdn.net/qq_31236027/article/details/121879741
Redis の概要
https://blog.csdn.net/qq_31236027/article/details/121879604
Redis データ構造の概要
https://blog.csdn。 net/qq_31236027/article/details/121894713
Redis データ構造の文字列型の紹介
https://blog.csdn.net/qq_31236027/article/details/122016881?spm=1001.2014.3001.5501

Supongo que te gusta

Origin blog.csdn.net/qq_31236027/article/details/122897761
Recomendado
Clasificación