ホームページ  >  記事  >  バックエンド開発  >  Redis チュートリアル (14): メモリ最適化の概要

Redis チュートリアル (14): メモリ最適化の概要

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

1. 特殊なエンコーディング:

Redis 2.2 以降、多くのデータ型は特殊なエンコーディングを通じてストレージ領域に合わせて最適化できます。このうち、整数で構成されるハッシュ、リスト、セットはすべてこの方法を使用してストレージ構造を最適化し、場合によっては 9/10 のスペースを節約できます。
これらの特別なエンコーディングは、Redis の使用に対して完全に透過的です。実際、これは単なる CPU とメモリ間のトランザクションです。メモリ使用量が多ければ、データを操作する際に消費する CPU も当然多くなりますし、その逆も同様です。 Redis は、次のような特殊なエンコーディングに関連するさまざまなしきい値を設定するための一連の構成パラメーターを提供します。

  #如果Hash中字段的数量小于参数值,Redis将对该Key的Hash Value采用特殊编码。
    hash-max-zipmap-entries 64
    #如果Hash中各个字段的最大长度不超过512字节,Redis也将对该Key的Hash Value采用特殊编码方式。
    hash-max-zipmap-value 512
    #下面两个参数的含义基本等同于上面两个和Hash相关的参数,只是作用的对象类型为List。
    list-max-ziplist-entries 512
    list-max-ziplist-value 64
    #如果set中整型元素的数量不超过512时,Redis将会采用该特殊编码。
    set-max-intset-entries 512

エンコードされた値が変更後に構成情報の最大制限を超えた場合、Redis はそれを通常の値に自動的に変換します。エンコード形式 この操作は非常に高速ですが、逆に実行して、大きな値の通常のエンコードを特殊なエンコードに変換する場合は、正式に実行する前に単純にテストするのが最善であると Redis は提案しています。なぜなら、そのような変換は多くの場合非常に非効率的だからです。

2. BIT およびバイト レベルの操作:


Redis 2.2 以降、Redis は文字列型の Key/Value に対して GETRANGE/SETRANGE/GETBIT/SETBIT という 4 つのコマンドを提供します。これらのコマンドを通じて、配列を操作するのと同じように String 型の値のデータにアクセスできます。たとえば、ユーザーを一意に識別する ID は、String 値の単なる部分文字列である可能性があります。このように、GETRANGE/SETRANGE コマンドを通じて簡単に抽出できます。さらに、BITMAP を使用して、ユーザーの性別情報 (男性は 1、女性は 0 など) を表すことができます。この方法を使用して 1 億人のユーザーの性別情報を表す場合、必要なストレージ容量は 12MB だけです。同時に、SETBIT/GETBIT コマンドによるデータ トラバースも非常に効率的です。

3. 可能な限りハッシュを使用する:

小さいハッシュ型データは比較的小さなスペースしか占有しないため、名前を含むユーザー登録情報やフィールドなどの実際のアプリケーションでは、可能な限りハッシュ型を使用することを検討する必要があります。性別、メールアドレス、年齢、パスワード。もちろん、この情報はキーの形式で保存でき、ユーザーが入力した情報は文字列値の形式で保存されます。ただし、Redis はハッシュの形式で保存することを好み、上記の情報はフィールド/値の形式で表現されます。
ここで、Redis のストレージ メカニズムを学習することで、このステートメントをさらに証明していきます。特別なエンコード メカニズムについてはこのブログの冒頭で説明しましたが、ハッシュ タイプに関連する 2 つの構成パラメータ、hash-max-zipmap-entries と hash-max-zipmap-value があります。彼らの行動範囲については以前に説明したので、ここでは詳しく説明しません。ここで、ハッシュ値に格納されているフィールドの数が hash-max-zipmap-entries 未満であり、各要素の長さも hash-max-zipmap-value 未満であると仮定します。このようにして、新しいハッシュ タイプのキー/値ストレージが存在するたびに、Redis はハッシュ値用の固定長スペースを作成します。事前に割り当てられる最大バイト数は次のとおりです:
total_bytes = hash-max-zipmap-entries * hash-max -zipmap-value
このようにして、ハッシュ内のすべてのフィールドの位置が予約され、配列にアクセスするのと同じようにフィールド/値にランダムにアクセスできます。それらの間のステップ間隔は hash-max-zipmap-value です。 。ハッシュ値のフィールド数または新しい要素の長さがそれぞれ上記の 2 つのパラメーター値を超​​える場合にのみ、Redis はそれらをハッシュ テーブルの形式で再保存することを検討します。それ以外の場合は、常にこの効率的なストレージを維持します。そしてアクセス。それだけでなく、各キーは有効期限や LRU などの関連するシステム情報を保存する必要があるため、文字列型のキー/値と比較して、ハッシュ型ではキーの数が大幅に削減されます (ほとんどのキーは形式で表現され保存されます)ハッシュ フィールドの))、これにより、ストレージ スペースの使用効率がさらに最適化されます。

上記は Redis チュートリアル (14): メモリ最適化の概要の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


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