ホームページ  >  記事  >  データベース  >  Redis のハッシュ データ型とその操作方法について話しましょう。

Redis のハッシュ データ型とその操作方法について話しましょう。

青灯夜游
青灯夜游転載
2021-12-31 10:16:252542ブラウズ

この記事では、redis のハッシュ データ型を理解し、ハッシュ型データの基本的な操作を紹介します。

Redis のハッシュ データ型とその操作方法について話しましょう。

1. ハッシュ型データの概要

最初にこの例を見てみましょう

前のセクションで文字列ストレージ型について一緒に学びましょう。しかし、オブジェクトデータの保存場所に頻繁な更新が必要な場合、操作が煩雑になります。例: user:id:100 -> {"id":100,"name":"Spring Festival Gala","fans":12355,"blogs":99,"focus:83}, if オブジェクト内のローカル データを更新する必要がある場合は、すべてのデータを置き換える必要があるため、次の要件があります。[関連する推奨事項: Redis ビデオ チュートリアル ]

新しい要件: オブジェクトに関する情報の保存など、管理を容易にするために一連の保存データをグループ化します。 必要なストレージ構造 : 1 つのストレージ スペースに複数のキーと値のペアのデータを保存します

以下に示すように :

Redis のハッシュ データ型とその操作方法について話しましょう。

この問題を解決するために、新しいデータ型 hash を導入します。構造も次のように最適化されています

  • フィールドの数が少ない場合、ストレージ構造は配列のような構造になるように最適化されます
  • ##フィールドの数が多い場合、格納構造は HashMap 構造を使用します
2. ハッシュ型データの基本操作

    データの変更・追加
  • hset key field value
    単一フィールドのクエリ/すべてのフィールドのクエリ
  • # 查询单个字段数据
    hget key field
    # 查询所有数据
    hgetall key
    削除操作
  • hdel key field1 [field2]
    複数のデータの変更/追加
  • hmset key field1 value1 field2 value2
    ハッシュ テーブル内の 1 つ以上の指定されたフィールドの値を返します
  • hmget key field1 field2
#ハッシュ テーブル内のフィールドの数を取得します
    #
    hlen key
  • 指定されたフィールドがハッシュ テーブルに存在するかどうかを取得します
    hexists key field
  • 3.hash データ型の拡張操作

すべてのフィールド名またはフィールド値を取得しますハッシュテーブル

    hkey key
    hvals key
  • 指定された文字部分の数値データを設定し、指定された範囲の値を増加させます
    hincrby key field increment
    hincrbyfloat key field increment
  • ハッシュ型データの操作上の注意

ハッシュ タイプの値は文字列のみを保存でき、他のデータ タイプは保存できず、ネストされたオブジェクトはありません。データが取得されない場合、対応する結果は ( nil);
  • 各ハッシュには、2 の 32 乗マイナス 1 のキーと値のペアを格納できます。
  • ハッシュ タイプは、次の値に非常に近いです。オブジェクトのデータ保存形式であり、オブジェクトの属性を柔軟に追加および削除できます。ただし、ハッシュの設計の本来の目的は、多数のオブジェクトを保存することではありません。ハッシュをオブジェクトとして使用することはもちろん、乱用しないように注意してください。 list;
  • hgetall 操作ではすべての属性を取得できます。内部フィールドが多すぎると、データ全体を走査するのが非効率になり、データ アクセスのボトルネックになる可能性があります。
  • #4. ハッシュの適用例

  • 4.1. ハッシュを使用したショッピング カートの実装

#概要

ここでは、ショッピング カートとデータベース間の永続的な同期や、ショッピング カートと注文の関係については説明しません。また、ログインしていないユーザーのショッピング カート情報の保存については無視します。 Redis ストレージ モデルは、ショッピング カート内のアイテムの 追加、参照、数量変更、削除、クリアにのみ使用されます

実装計画

顧客 ID をキーとして、各ユーザーはショッピング カート情報に対応するハッシュ ストレージ構造を作成します。

製品番号をフィールドとして、購入数量をストレージの値として使用します
  • 製品の追加: 新しいフィールドと値の追加
  • 製品の参照: ハッシュのトラバース
  • 数量の変更: 自動インクリメント/自動デクリメント、値の設定
  • 製品の削除: 削除フィールド
  • Clear: 削除キー
  • サンプルコードは次のとおりです。
  • # 001 用户购买 ID为101商品 100件,ID为102的商品 200件
    hmset 001 101 100 102 200
    # 002 用户购买 ID为102商品 1件,ID为104的商品 7件
    hmset 002 102 1 104 7
製品情報アクセラレーション

現在Redis には数量のみが保存されますが、データベース内で製品情報を照会する必要があるため、プロセスは高速化されません。次の解決策を使用できます。 各ショッピング カートの製品情報レコードは 2 つのフィールドとして保存されます。

フィールド 1 は数量を保存するために特別に使用されます

    命名形式: 製品 ID:nums 保存データ: 値
フィールド2は、テキスト説明、画像アドレス、関連ビジネス情報などを含む、ショッピング カートに表示される製品情報を保存するために特別に使用されます。

    命名形式: 製品ID:info 保存データ:json
  • サンプルコードは以下のとおりです。
# 001 用户 购买 ID为101的商品 2件,商品的信息为:{"name":"good name"} 
hmset 001 101:num 2  101:info "{\"name\":\"goods name\"}"
# 002 用户 购买 ID为101的商品 1件,商品的信息为:{"name":"good name"} 
hmset 002 101:num 1  101:info "{\"name\":\"goods name\"}"

上記の

101:info

に相当する値は、文字列にスペースが含まれるため、引用符で囲みます。エスケープの目的を達成するために、二重引用符を使用します。

製品情報は独立して保存されます

フィールド 2 は複数の製品レコードに存在する可能性があるため、フィールド 2 のデータは独立したハッシュに保存できます。このとき、ショッピングカートのレコードを追加するたびにハッシュデータを保存するのは明らかに無理です。hsetnx 操作でデータを保存できます。データが存在する場合、保存操作は実行されません。 。

コマンドの形式は次のとおりです<pre class="brush:js;toolbar:false;">hsetnx key field value</pre>コード例は次のとおりです

# 将id为101 的商品独立存起来
hsetnx info 101 "{\"name\":\"goods name\"}"

4.1. 用hash实现抢购

案例:双 11 活动日,销售手机充值卡的商家对移动、联通、电信的 30 元、50 元、100 元商品推出抢购活动,每种商品的抢购上限为 100。

解决方案

  • 以商家 id 作为 key
  • 将参与抢购的商品作为 field
  • 将参与抢购的商品数量作为对应的 value
  • 抢购时使用降值的方式控制产品数量
  • 实际业务中还有超卖等实际问题,这里不做讨论

实现过程

商品初始信息

# p01商家下,c30充值券1000张,c50充值券1000张,c100充值券1000张
hmset p01 c30 1000 c50 1000 c100 1000

当 c30 售出1件时,值减 1; 当 c100 售出 20 件时,值减 20,如下代码

# p01商家,商品c30售出1件
hincrby p01 c30 -1
# p01商家,商品c100售出20件
hincrby p01 c100 -20

5. string 存对象对比 hash 存对象

  • string 存储 json 字符串:读取方便,在更新的时候会整体进行更新

  • hash 存对象具体的字段:更新灵活

引入 hash 数据类型之后,我们就解决了 string 存储对象,更新对象时需要整体更新的问题。

更多编程相关知识,请访问:编程入门!!

以上がRedis のハッシュ データ型とその操作方法について話しましょう。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。