Redisオープンソース読書ノート6(sdsモジュール)

3359 ワード

SDSは動的文字列ライブラリであり、主に文字列操作に用いられる.
SDSモジュール機能特性===文字列基本操作(new,free,dup,cpy,append,add,trim,cmp,range,split,join,lower,upper,map,repr)をサポート
==文字列の実際の長さと残りの長さの統計をサポート
==』バイナリ(文字列)セキュリティ操作(new,free,dup,cpy,cmp,append,range)をサポート
==文字列の動的拡張をサポート(パフォーマンスの最適化)
注意:ここでのバイナリ・セキュリティ・アクションは、オブジェクトなどの文字列ではないことを意味します.
SDSモジュール構造体
struct sdshdr {
    unsigned int len;
    unsigned int free;
    char buf[];
};

SDSモジュール内部インタフェースsds sdsMakeRoomFor(sds,size_t addlen);
sds文字列の末尾に空きバイトを拡張します.拡張規則は元のsds文字列の2倍またはsds長にSDS_を加えるMAX_PREALLOC
void sdsIncrLen(sds s, int incr);
修正sds s文字列incr長増加後文字列末尾NULLとsds関連データ構造の操作
sds sdsRemoveFreeSpace(sds s);
sds拡張の末尾空きバイトを削減し、100%成功
size_t sdsAllocSize(sds s);
sds文字列の合計占有スペースバイト数の取得
SDSコードの読み取りで理解する必要がある内部関数の一部sds sdscatvprintf(sds,const char*fmt,va_list ap);
フォーマット文字列をsds文字列の末尾に追加
int sdsll2str(char *s, long long value)
long longタイプが文字列に変換される関数で、ここではLLSTRの長さが21文字と書かれています.主にlonglongの範囲は最大20ビットで、NULLを加えると、ちょうど21ビットです.
long longの最大値:922337203685475807--19ビット
long longの最小値:-922337203685475808--20ビット
#define SDS_LLSTR_SIZE 21/*NULL末尾文字列を含む*/
SDSモジュール基本インタフェース
static inline size_t sdslen(const sds s)
sds文字列の長さの取得
static inline size_t sdsavail(const sds s)
sds文字列の空き領域の取得
sds sdsnewlen(const void *init, size_t initlen);
Initポインタでsdsセキュリティ文字列を新規作成する
sds sdsnew(const char *init);
ASCII文字列初期化sds文字列を新規作成
sds sdsempty(void);
空のsds文字列を新規作成
sds sdsdup(const sds s);
sds文字列をコピー
void sdsfree(sds s);
sds文字列を解放
sds sdsgrowzero(sds s, size_t len);
sds文字列をlen長に拡張し、残りの空間を0に初期化
sds sdscatlen(sds s, const void *t, size_t len);
sds文字列をlen長に追加し、残りの空間をtが指すlen長の内容に追加する
sds sdscat(sds s, const char *t);
NULL末尾文字列をsds文字列末尾に追加
sds sdscatsds(sds s, const sds t);
sds t文字列をsds s文字列の末尾に追加
sds sdscpylen(sds s, const char *t, size_t len);
文字列tをsds文字列にコピーする
sds sdscpy(sds s, const char *t);
NULL末尾文字列tをsds文字列にコピー
sds sdscatprintf(sds s, const char *fmt, ...);
フォーマット文字列をsds文字列の末尾に追加
sds sdscatfmt(sds s, char const *fmt, ...);
sdscatprintfパフォーマンス最適化バージョン
sds sdstrim(sds s, const char *cset);
sds文字列の左右のcset文字列に属する文字を切り取ります
void sdsrange(sds s, int start, int end);
sds文字列の内容を[start,end]範囲のsds文字列の内容に更新する
void sdsupdatelen(sds s);
sds文字列内部状態データの更新(文字長、空き領域)
void sdsclear(sds s);
sds文字列の内部データを空にします(ステータスデータはクリーンアップされ、内容はまだ完全にクリアされていません)
int sdscmp(const sds s1, const sds s2);
sds文字列比較関数memcmpに類似
sds *sdssplitlen(const char *s, int len, const char *sep, int seplen, int *count);
文字列分割関数、countサイズのsds文字列配列を返す
sds *sdssplitargs(const char *line, int *argc);
パラメータ分割関数、arcサイズのsds文字列配列を返す
void sdsfreesplitres(sds *tokens, int count);
sdsplitlen,sdsplitargsで分割されたsds文字列配列を解放する
void sdstolower(sds s);
sds文字列変更全小文字
void sdstoupper(sds s);
sds文字列変更全大文字
sds sdsfromlonglong(long long value);
valueをsds文字列に変換
sds sdscatrepr(sds s, const char *p, size_t len);
pが指す文字列を人間が読めるようにsdsの後ろに追加する
sds sdsmapchars(sds s, const char *from, const char *to, size_t setlen);
sds文字列内を[from,to]の文字mapマッピングで変換
sds sdsjoin(char **argv, int argc, char *sep);
文字列をセパレータで接続(sep)、sds文字列を返します.