Redisのデータ構造は、()文字列を達成するために
文字列値を表す文字列に対してSDS(単純な動的文字列)を使用してRedisのを修正することができます。Redisのは、キーと値に使用しました。
注:Redisのこのタイプは、すべてのキー、値は異なる他の種類があり、SDSは、バッファに使用することができます。
次のように特定の定義されました:
なぜネイティブのC文字列?
- 各文字列Cはあまり効率的で文字列の長さ全体を走査する必要がある場合がSTRLEN Redisのコマンドので、コマンドは、値(文字列型でなければなりません)に対応するキーの長さを要求することができます。SDSとRedisのLEN長さ属性が提供され、長さはそれが時間O(1)で決定することができます。
- 文字列連結バッファ・オーバーフローの問題がCに存在する場合、Redisのもステッチが最初に十分な空きがあるか否かをチェックする前に、使用される文字列の連結であるsdscatコマンドを有し、全く空間が最初に割り当てられず、その後、ステッチされます。
- Redisのは、バイナリデータを格納する必要があり、そしてC「\ 0」の文字列は、それが終わり、バイナリデータを保存する方法はありませんに到達したか否かを判断します。
注:SDSとのRedisのが、しかし、C言語で提供さリユース文字列操作関数のために、または(LEN伝統的な〜の「\ 0」末端に従うには、これは「\ 0」が、実際の割り当てではありません解放アレイは、バフに割り当てられる場合。
SDSメモリーの再分配政策?
我々はすべて知っている、ステッチの文字列、切断も、それはの割り当てを最適化する方法を、メモリリークを持って効率が低下します非常に頻繁に操作、不適切なメモリの割り当てと回復で、十分な空きメモリが割り当てられますがない場合だけ、の話それは?
- 事前に割り当てられた領域
- lenが1M未満変更した場合、それがLENに等しい自由スペースの長さと一緒に、事前に割り当てられます
- lenが1M以上を変更した場合は、スペースが1Mに事前に割り当てられています
- 不活性なスペースが解放されました
(文字列の長さが減少する)文字列を切断し、そしてスペースがすぐに解放されず、次の使用のために残っている場合。RedisのSDSはまた、未使用のメモリコマンドの放出を提供する(sdsRemoveFreeSpaceのコマンド)
次のように削除コード不活性です。