找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4847|回复: 0

[原]Redis源代码分析之五:简单动态字符串

[复制链接]
发表于 2012-2-4 21:57:54 | 显示全部楼层 |阅读模式
一个Redis字符串的结构体定义是:struct sdshdr {
  1.     int len;
  2.     int free;
  3.     char buf[];
  4. };
复制代码

其中buf字符数组中储存实际的字符串。len变量保存字符串的长度。free变量指出还有多少字节可用。
sds被定义为一种新的数据类型,实际就是字符指针:

typedef char *sds;
例如,sdsnewlen创建一个指定长度的新的Redis字符串:
  1. sds sdsnewlen(const void *init, size_t initlen) {
  2.     struct sdshdr *sh;
  3.     sh = zmalloc(sizeof(struct sdshdr)+initlen+1);
  4. #ifdef SDS_ABORT_ON_OOM
  5.     if (sh == NULL) sdsOomAbort();
  6. #else
  7.     if (sh == NULL) return NULL;
  8. #endif
  9.     sh->len = initlen;
  10.     sh->free = 0;
  11.     if (initlen) {
  12.         if (init) memcpy(sh->buf, init, initlen);
  13.         else memset(sh->buf,0,initlen);
  14.     }
  15.     sh->buf[initlen] = '\0';
  16.     return (char*)sh->buf;
  17. }
复制代码
全部的sds接口定义如下:static inline size_t sdslen(const sds s) {
  1.     struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
  2.     return sh->len;
  3. }
  4. static inline size_t sdsavail(const sds s) {
  5.     struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
  6.     return sh->free;
  7. }
  8. sds sdsnewlen(const void *init, size_t initlen);
  9. sds sdsnew(const char *init);
  10. sds sdsempty();
  11. size_t sdslen(const sds s);
  12. sds sdsdup(const sds s);
  13. void sdsfree(sds s);
  14. size_t sdsavail(sds s);
  15. sds sdsgrowzero(sds s, size_t len);
  16. sds sdscatlen(sds s, void *t, size_t len);
  17. sds sdscat(sds s, char *t);
  18. sds sdscatsds(sds s, sds t);
  19. sds sdscpylen(sds s, char *t, size_t len);
  20. sds sdscpy(sds s, char *t);
  21. sds sdscatvprintf(sds s, const char *fmt, va_list ap);
  22. #ifdef __GNUC__
  23. sds sdscatprintf(sds s, const char *fmt, ...)
  24.     __attribute__((format(printf, 2, 3)));
  25. #else
  26. sds sdscatprintf(sds s, const char *fmt, ...);
  27. #endif
  28. sds sdstrim(sds s, const char *cset);
  29. sds sdsrange(sds s, int start, int end);
  30. void sdsupdatelen(sds s);
  31. void sdsclear(sds s);
  32. int sdscmp(sds s1, sds s2);
  33. sds *sdssplitlen(char *s, int len, char *sep, int seplen, int *count);
  34. void sdsfreesplitres(sds *tokens, int count);
  35. void sdstolower(sds s);
  36. void sdstoupper(sds s);
  37. sds sdsfromlonglong(long long value);
  38. sds sdscatrepr(sds s, char *p, size_t len);
  39. sds *sdssplitargs(char *line, int *argc);
复制代码



作者:Aegeaner 发表于2012-2-4 15:40:27 原文链接

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 02:02 , Processed in 0.022317 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表