ホームページ  >  記事  >  データベース  >  Redis SDS のデータ構造は何ですか?

Redis SDS のデータ構造は何ですか?

WBOY
WBOY転載
2023-05-27 20:31:041220ブラウズ

1 はじめに

Redis の文字列データ構造 SDS (Simple Dynamic String) は、単純な動的文字列を意味します。文字通りの意味は、単純で、操作が簡単で、ユーザーがすぐに理解できることを意味します。 Redis の内部実装を気にせずに始めましょう; Dynamic は動的拡張を指し、テーブルは自動的にメモリ領域を動的に割り当てることができます; String は文字列を表し、理解するのは難しくありません。

SDS 構造

2.1 redis SDS データ構造

redis3.2 より前のデータ構造は次のとおりです;
    struct sdshdr {
        unsigned int len;   
        unsigned int free;  
        char buf[];         
    };
  • len は buf (バッファ) で使用されているスペースの長さを表します;
  • free は buf の未使用の長さを表します;
  • buf[ ] は文字を格納するバッファ配列を表します;
  • 2.12 redis バッファ構造

    より鮮明な格納イメージは次のとおりです。buf の実際のサイズは 11 (len free) 1)、使用済みスペース len = 5、未使用スペース free = 5; 予約スペース文字 \0 が 1 ビットを占有; 文字列 zxzxz を Redis に保存すると、メモリがスペースに割り当てられます。後で使用できるメモリ空間。C 言語の場合、zxzxz の文字長を取得するには、文字配列全体を走査し、\0 に遭遇した後に終了する必要があります (C 言語はメモリ空間内の文字列を区別するために \0 を使用します) ). 文字列の長さを計算します。ただし、Redis はアルゴリズムから文字列の長さを計算するために sdslen

    を 1 つだけ必要とします (C 言語以外の読者はこの種の API について心配する必要はありません)。観点から見ると、redis は一度に文字を取得します。文字列の長さは O(1)、C 言語は O(N) なので、redis の方がはるかに高速です。

    redis SDS的数据结构是怎样的

    2.2 redisスペース割り当て戦略

    第二に、上記により、文字列 zxzxz が格納されており、その長さが 5 であることがわかります。したがって、使用されるスペースは 5 で、\0 になります。 1 を占有します。その理由は、Redis 文字列ストレージ サイズが 1MB 未満の場合、任意の文字列が格納され、その空きサイズは常に自身のサイズと同じになります。文字列サイズが 1MB を超える場合、空きサイズが割り当てられるためです。 スペース事前割り当て戦略

    と呼ばれる1MB; C言語の場合、buf内の現在の文字列の長さを計算し、追加する文字列の長さを計算して、スペース; したがって、redis の速度は、C のメモリ空間の操作と比較して非常に高速です;

    C 言語はメモリ空間を操作します 文字列を追加するときは、サイズを常に計算し、追加時にスペース サイズを割り当てる必要があります。文字列が割り当てられていない場合、追加された文字列はメモリ空間に格納されている文字列を上書きする可能性があります; 例: メモリ空間 storagezzz \ 0kkk\0; zzz を格納する場合、それは 3 ビットを占有します。プラス 1 ビットの未割り当て領域です。zzz 文字列に ggg が追加されると、割り当てられた領域を計算せずに元のデータが失われます。zzzggg\0k\0

    となり、非常に直感的にわかります。メモリオーバーフローの場合、最初の文字列が2番目の文字列の一部をカバーします;

    つまり、redisの操作コンテンツスペースメモリオーバーフローを防ぐためであり、写真やビデオなどのバイナリデータを保存できますストレージがCで操作されている場合言語では、バイナリ ファイル内の \0 はメモリ リークやバッファ オーバーフローなどを引き起こす可能性があるため、C 言語は通常テキスト ファイルのみを操作します。

    以上がRedis SDS のデータ構造は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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