この記事では、Redis SDS 動的文字列と C 文字列の違いを紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
#Redis の最下位層は、それを表すために "C 文字列" を使用しませんが、デフォルトの文字列表現に独自に構築された "SDS 抽象型" を使用します。 [関連する推奨事項: Redis ビデオ チュートリアル ]
C 文字列に格納されたデータの末尾には null 文字が含まれます。 たとえば、「redis」の実際の形式は 'R' 'E' 'D' 'I' 'S' '\0'
SDS は redis によって構築された抽象型で、主に redis のデフォルトの文字列表現、AOF モジュール内の AOF バッファ、およびクライアント ステータス入力バッファを格納するために使用されます。
SDS 抽象型コンテンツには次のものが含まれます:
int len、文字列
int free の長さを記録するために使用されます。 used buf array
char buf[] 内の未使用のバイト数を記録するには、バイト配列を使用して文字列
を保存します。 SDS 構造は下図のとおりです
1.長さを求める場合
C 文字列は文字列の長さを知るために走査する必要があり、複雑さは O(n) です。
SDS は内部の len 属性にアクセスするだけでよく、時間複雑さは O です(1).
2. バッファ オーバーフローの問題
C 文字列は S1 を "redis" として設定しますが、それに隣接する S2 が "abc" として存在します。 S1 が関数 strcat を通じて S3 "ccc" に接続されている場合、最終結果は "redisccc" になるはずですが、S1 に設定されたメモリが十分でない場合、これにより S2変更する隣にあります。
SDS は、まずスペースが十分であるかどうかを判断し、十分でない場合は、スペースが十分な位置に拡張され、len 長の未使用の空きスペースが追加されます。 Redis 文字列は 5 であり、その後追加されます。スペースは同じ長さの 5 に事前に割り当てられており、最終的な実際のスペース長は空き len 1 ~ 10 です。
3. 文字列のメモリ割り当て
c 文字列では、データが特定の文字列に追加または削減されると、メモリが再適用されます。アプリケーションは必然的にパフォーマンスの低下につながるため、N 回変更されると、N 回割り当てられることになります。
SDS は内部で 2 つのメカニズムを使用します: 遅延スペース解放とスペース事前割り当て
スペース事前割り当て:
スペース事前割り当て: 実行時を指します。スペース割り当て 、元のベースで len 長のスペースを割り当てます
ここで、SDS 長が 1M 未満の場合、空き = len になります。たとえば、SDS 長が 6 バイトの場合、実際の領域は 6byte 6byte 1byte
1M より大きい場合、さらに 1M だけが割り当てられます。 free = 1M 例えば、SDS 長が 60M の場合、実際の領域は 60M 1M 1byte
Lazy space release
ある文字列を削減すると、このようになります。プログラムは、短縮されたバイトをリサイクルするためにすぐにメモリの再割り当てを使用しませんが、その後の使用のために空きを介してそれらを記録します。また、SDS は、遅延領域によるメモリの無駄を防ぐための対応する API も提供します。
4. バイナリ セキュリティ
c 文字列は最終的に null 文字で終了しますが、特殊なデータに null 文字が必要な場合、データは最初のヌル文字より前のデータが事前に認識されます。 SDS SDS は長さに基づいて文字列を識別するため、データの正確性を保証できます。
5. 一部の C 言語関数と互換性があります SDS も C の null 文字末尾に従っているため、C の一部の関数を使用できます
#概要 学習中にメモを記録し、深めて覚えて、続けてください。ご質問がございましたら、ご指摘ください。ありがとうございます。 プログラミング関連の知識について詳しくは、プログラミング ビデオをご覧ください。 !
以上がRedis SDS と C 文字列の違いに関する簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。