Redis — SDS API 详解

Redis使用SDS的原因 SDS定义 struct sdsher{ //记录buf中已保存字符的长度 //等于SDS所保存的字符串的长度 int len; //记录buf数组中未使用字节的数量 int free; //字节数组,用于保存字符串 char buf[]; }; 说明:SDS为了能够使用部分C字符串函数,遵循了C字符串以空字符结尾的惯例,保存空字符的1字节不计算在SDSlen属性中,并且为空字符分配额外... 阅读详情

SDS 数据结构

  • typedef char *sds;
     
    struct sdshdr {
        // 记录buf数组中已使用字节的数量
        // 等于SDS所保存字符串的长度
        int len;
        // 记录buf数组中未使用字节的数量
        int free;
        // 字节数组,用于保存字符串
        char buf[];
    };

SDS API

  • 函数名称作用复杂度
    sdsnew创建一个包含给定C字符串的SDSO(N),N为给定C字符串的长度
    sdsempty创建一个不包含任何内容的空SDSO(1)
    sdsfree释放给定的SDSO(N),N为被释放SDS的长度
    sdslen返回SDS已经使用过的空间字符数O(1),直接读取SDS的len属性来直接获得
    sdsavail返回SDS中未使用的空间字符数O(1),直接读取SDS的free属性来直接获得
    sdsdup创建一个给定SDS的副本O(N),N为给定SDS的长度
    sdsclear清空SDS中字符串保存的内容因为惰性空间释放策略,复杂的为O(1)
    sdscat将C字符串拼接到SDS字符串末尾O(N),N为被拼接C字符串的长度
    sdscatsds将SDS拼接到另一个SDS中O(N),N为被拼接SDS字符串的长度
    sdscpy将给定的C字符串复制并覆盖到SDS中的字符串O(N),N为被复制C字符串的长度
    sdsgrowzero用空字符将SDS扩展至给定的长度O(N),N为扩展新增的字节数
    sdsrangeSDS区间内的数据保留, 区间之外的数据覆盖或清除O(N),N为被保留数据的字节数
    sdstrim接受一个SDS和一个C字符串作为参数, 从移除SDS中移除所有在C字符串中出现过的字符O(N^2),N为给定C字符串的长度
    sdscmp对比两个SDS字符串是否相等O(N),N为两个SDS中较短的那个SDS的长度

API 实现

  • SDS 创建

    • 创建一个空的sds,len和free都为0,buf数组也为空

    • sds sdsempty(void) {
          return sdsnewlen("",0);
      }
    • 创建一个sds(空的或非空)

    • sds sdsnew(const char *init) {
          size_t initlen = (init == NULL) ? 0 : strlen(init);
          return sdsnewlen(init, initlen);
      }
    • 其中均会调用sdsnewlen,这个函数主要是分配内存和赋值

    • sds sdsnewlen(const void *init, size_t initlen) {
          struct sdshdr *sh;
       
          sh = malloc(sizeof(struct sdshdr)+initlen+1);
      #ifdef SDS_ABORT_ON_OOM
          if (sh == NULL) sdsOomAbort();
      #else
          if (sh == NULL) return NULL;
      #endif
          sh->len = initlen;
          sh->free = 0;
          if (initlen) {
              if (init) memcpy(sh->buf, init, initlen);
              else memset(sh->buf,0,initlen);
          }
          sh->buf[initlen] = '\0';
          return (char*)sh->buf;
      }
  • SDS 长度操作

    • 获取 sds 的数据长度

    • size_t sdslen(const sds s) {
          struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr)));
          return sh->len;
      }
    • 获取 sds 的空闲大小

    • size_t sdsavail(sds s) {
          struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr)));
          return sh->free;
      }
    • 更新 sds 的长度信息

    • void sdsupdatelen(sds s) {
          struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr)));
          int reallen = strlen(s);
          sh->free += (sh->len-reallen);
          sh->len = reallen;
      }
  • SDS 扩容操作

    • static sds sdsMakeRoomFor(sds s, size_t addlen) {
          struct sdshdr *sh, *newsh;
          size_t free = sdsavail(s);
          size_t len, newlen;
       
          if (free >= addlen) return s;
          len = sdslen(s);
          sh = (void*) (s-(sizeof(struct sdshdr)));
          newlen = (len+addlen)*2;   //原先数据+新增数据 的两倍
          newsh = realloc(sh, sizeof(struct sdshdr)+newlen+1);
      #ifdef SDS_ABORT_ON_OOM
          if (newsh == NULL) sdsOomAbort();
      #else
          if (newsh == NULL) return NULL;
      #endif
       
          newsh->free = newlen - len; //两倍数据-原先数据长度,后面free再减去新增数据长度addlen,即可保证free的大小和len的最终的大小相等
          return newsh->buf;
      }
    • 函数的参数 addlen是要增加的长度,首先它会跟 free 比较,如果 addlen 小,sds 放得下,无需扩容;如果 addlen 大,则需要扩容,重新分配内存,重新计算的数组大小是原先存放的数据加上新增数据之和的两倍(newlen),因为一倍给 free,另外一倍存放最终的数据,目前的新 sds 中的free 大小是两倍长度 - 原先的数据大小。
  • SDS 追加在某个SDS的后面

    • sdscat 将字符串 t 追加在具有sds结构的 s 后面,并返回一个sds结构(如果没有扩容就是原先那个sds)
    • sds sdscat(sds s, char *t) {
          return sdscatlen(s, t, strlen(t));
      }
    • 其中用到了sdscatlen
    • sds sdscatlen(sds s, void *t, size_t len) {
          struct sdshdr *sh;
          size_t curlen = sdslen(s);
       
          s = sdsMakeRoomFor(s,len);
          if (s == NULL) return NULL;
          sh = (void*) (s-(sizeof(struct sdshdr)));
          memcpy(s+curlen, t, len);
          sh->len = curlen+len;      //最终大小为原先数据长度加上新增的字符串长度
          sh->free = sh->free-len;   //这个len是新增数据长度,sh->free大小是两倍长度减去原先数据长度,再减个len,即为free字段是原先数据长度加上新增的数据长度,保证和最终的sh->len大小一致
          s[curlen+len] = '\0';
          return s;
      }
  • SDS 将字符串拷贝到SDS中,会覆盖掉原先的数据

    • sds sdscpy(sds s, char *t) {
          return sdscpylen(s, t, strlen(t));
      }
    • sds sdscpylen(sds s, char *t, size_t len) {
          struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr)));
          size_t totlen = sh->free+sh->len;
       
          if (totlen < len) {
              s = sdsMakeRoomFor(s,len-totlen); //此处应该是len- sh->len
              if (s == NULL) return NULL;
              sh = (void*) (s-(sizeof(struct sdshdr)));
              totlen = sh->free+sh->len; //新的sh->free为两倍大小除去原先的数据长度,sh->len为原先的数据长度,现在相加,totlen值为两倍大小
          }
          memcpy(s, t, len);
          s[len] = '\0';
          sh->len = len;     //最终的sds中的len为拷贝的字符串的长度
          sh->free = totlen-len;   ////最终的sds中的free也为拷贝的字符串的长度(两倍减去了一倍)
          return s;
      }
    • 同样最后会保证 free 的大小和 len 的相同。
  • SDS 通过格式化输出的形式,追加到给定的SDS后

    • sds sdscatprintf(sds s, const char *fmt, ...) {
          va_list ap;
          char *buf, *t;
          size_t buflen = 32;
       
          va_start(ap, fmt);
          while(1) {
              buf = malloc(buflen);
      #ifdef SDS_ABORT_ON_OOM
              if (buf == NULL) sdsOomAbort();
      #else
              if (buf == NULL) return NULL;
      #endif
              buf[buflen-2] = '\0';     //在倒数第二个打上标记,如果被覆盖了说明分配的内存不够
              vsnprintf(buf, buflen, fmt, ap);
              if (buf[buflen-2] != '\0') {
                  free(buf);
                  buflen *= 2;
                  continue;
              }
              break;
          }
          va_end(ap);
          t = sdscat(s, buf);
          free(buf);
          return t;
      }
    • 此函数是以格式化输出的形式追加到给定的 sds 后面,首先默认分配32字节的内存,在倒数第二个字节打上结束标记,然后拷贝格式化输出的内容,如果倒数第二个字节被覆盖,说明分配的大小不够,采取的策略是翻倍尝试,最后调用前面的 sdscat 追加。
  • SDS 比较两个SDS

    • int sdscmp(sds s1, sds s2) {
          size_t l1, l2, minlen;
          int cmp;
       
          l1 = sdslen(s1);
          l2 = sdslen(s2);
          minlen = (l1 < l2) ? l1 : l2;
          cmp = memcmp(s1,s2,minlen);
          if (cmp == 0) return l1-l2;
          return cmp;
      }
    • sds s1和s2保存的字符串长度可能不一样,如果长度一样的话,直接调用 memcmp 比较即可,如果不一样的话,首先需要计算出较小的长度 minlen,调用 memcmp 比较前 minlen 个字符串,如果前 minlen 个不一样的话,直接返回比较结果(此时已出胜负),如果前 minlen 个是一样的,则较长的为大。
  • SDS 对给定的字符串按给定的 sep 分隔符来切割

    • /* Split 's' with separator in 'sep'. An array
       * of sds strings is returned. *count will be set
       * by reference to the number of tokens returned.
       *
       * On out of memory, zero length string, zero length
       * separator, NULL is returned.
       *
       * Note that 'sep' is able to split a string using
       * a multi-character separator. For example
       * sdssplit("foo_-_bar","_-_"); will return two
       * elements "foo" and "bar".
       *
       * This version of the function is binary-safe but
       * requires length arguments. sdssplit() is just the
       * same function but for zero-terminated strings.
       */
      sds *sdssplitlen(char *s, int len, char *sep, int seplen, int *count) {
          int elements = 0, slots = 5, start = 0, j;
       
          sds *tokens = malloc(sizeof(sds)*slots);
      #ifdef SDS_ABORT_ON_OOM
          if (tokens == NULL) sdsOomAbort();
      #endif
          if (seplen < 1 || len < 0 || tokens == NULL) return NULL;
          for (j = 0; j < (len-(seplen-1)); j++) {
              /* make sure there is room for the next element and the final one */
              if (slots < elements+2) {
                  slots *= 2;
                  sds *newtokens = realloc(tokens,sizeof(sds)*slots);
                  if (newtokens == NULL) {
      #ifdef SDS_ABORT_ON_OOM
                      sdsOomAbort();
      #else
                      goto cleanup;
      #endif
                  }
                  tokens = newtokens;
              }
              /* search the separator */
              if ((seplen == 1 && *(s+j) == sep[0]) || (memcmp(s+j,sep,seplen) == 0)) {
                  tokens[elements] = sdsnewlen(s+start,j-start);
                  if (tokens[elements] == NULL) {
      #ifdef SDS_ABORT_ON_OOM
                      sdsOomAbort();
      #else
                      goto cleanup;
      #endif
                  }
                  elements++;
                  start = j+seplen;
                  j = j+seplen-1; /* skip the separator */
              }
          }
          /* Add the final element. We are sure there is room in the tokens array. */
          tokens[elements] = sdsnewlen(s+start,len-start);
          if (tokens[elements] == NULL) {
      #ifdef SDS_ABORT_ON_OOM
                      sdsOomAbort();
      #else
                      goto cleanup;
      #endif
          }
          elements++;
          *count = elements;
          return tokens;
       
      #ifndef SDS_ABORT_ON_OOM
      cleanup:
          {
              int i;
              for (i = 0; i < elements; i++) sdsfree(tokens[i]);
              free(tokens);
              return NULL;
          }
      #endif
      }
    • 比如字符串 foo_-_bar_-_fun使用分割符_-_,分割符长度是3,最后得到3个(count的值)sds *结构的 tokens,tokens[0] 存放的是sds结构的 foo,tokens[1] 存放的是 sds 结构的 bar,tokens[2] 存放的是 sds 结构的 foo。
  • SDS 字符串范围操作

    • sdsrange----截取给定的sds,[start, end]字符串。如start为3,表示字符串中第4个字符,字符串下标从0开始,如为-1,表示是最后一个字符,同理-2表示倒数第2个字符。
    • sds sdsrange(sds s, long start, long end) {
          struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr)));
          size_t newlen, len = sdslen(s);
       
          if (len == 0) return s;
          if (start < 0) {
              start = len+start;
              if (start < 0) start = 0;
          }
          if (end < 0) {
              end = len+end;
              if (end < 0) end = 0;
          }
          newlen = (start > end) ? 0 : (end-start)+1;
          if (newlen != 0) {
              if (start >= (signed)len) start = len-1;
              if (end >= (signed)len) end = len-1;
              newlen = (start > end) ? 0 : (end-start)+1;
          } else {
              start = 0;
          }
          if (start != 0) memmove(sh->buf, sh->buf+start, newlen);
          sh->buf[newlen] = 0;
          sh->free = sh->free+(sh->len-newlen);
          sh->len = newlen;
          return s;
      }
    •  sdstrim---对给定sds,删除前端/后端在给定的C字符串中出现过的字符。
    • sds sdstrim(sds s, const char *cset) {
          struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr)));
          char *start, *end, *sp, *ep;
          size_t len;
       
          sp = start = s;
          ep = end = s+sdslen(s)-1;
          while(sp <= end && strchr(cset, *sp)) sp++;
          while(ep > start && strchr(cset, *ep)) ep--;
          len = (sp > ep) ? 0 : ((ep-sp)+1);
          if (sh->buf != sp) memmove(sh->buf, sp, len);
          sh->buf[len] = '\0';
          sh->free = sh->free+(sh->len-len);
          sh->len = len;
          return s;
      }
  • SDS 复制操作

    • 返回一个新的sds,内容与给定的 s 相同。
    • sds sdsdup(const sds s) {
          return sdsnewlen(s, sdslen(s));
      }
  • SDS 释放操作

    • void sdsfree(sds s) {
          if (s == NULL) return;
          free(s-sizeof(struct sdshdr));
      }

 

Redis源码阅读——SDS Redis源码阅读——SDS 参考Redis设计与实现 以及网上博客阅读Redis源码。 SDS相关知识点见读书笔记。 创建和销毁 为了能够对sds进行相关API的测试,因此把sds模块单独提出来。阅读Redis的Makefile发现,编译sds模块需要的源文件包括sds.c, sds.h zmalloc.c test-sds: sds.c sds.h $(REDIS_CC) s... 阅读详情

相关推荐

osgearth2.10 demo功能介绍

osgearth-2.10 demo: 说明: 1、运行环境win7 x64 旗舰版,CPU i5-6400 8核,8G内存; 2、括号内是对应demo的测试参数(.earth); 3、配置OSG_FILE_PATH; 4、参数命令行可以查看各个demo需要的输入参数; 5、前缀说明:gui界面程序、cmd控制台程序、non功能未知; 6、程序后括号里的non表示不需要通过命令行输入参数; 示例: 1、gui:osgearth_3pv(simple.earth):相机与地球的投影关系,Range表示相机

rach09的专栏 2421

Redis提供的API

Redis提供的API分类整理

猴子哥哥的博客 806

【加密社】私钥碰撞器,秒杀市面上的碰撞器

基于上述的逻辑和代码,开发了ETH挖掘器(图1.1)这里有个亮点是:1.很多开发者在判断地址是否有效的环节上,用的是查询余额,其实这是不对的,查询余额你可能只能查询对应代币的余额,例如usdt,eth等但是如果用查询交易次数就不一样了,你只要是交易过,我就认为是有效钱包,这样的速度比查询余额要快,也要更准确。2.rpc节点可配置。

加密社的博客 1576

redis--sds API 详解

1,sds 数据结构 typedef char *sds; struct sdshdr { long len; long free; char buf[0]; }; 注意:sizeof(struct sdshdr)的大小只包括 sizeof(len)和sizeof(free),不含buf数组,buf数组的内存紧随这个结构体后面。 2,sds API 函数名称...

sanliangGoGoGo 1528

WSL2 Ubuntu复现FoundationPose项目(docker)

复现一个基于深度学习的物体姿态估计框架FoundationPose项目,使用docker,WSL2

woaidawangwang的博客 1998

02-基于ART-PI开发板创建USB CDC 虚拟串口设备

本例在ART-PI开发板上,基于RT-Thread 5.0,5虚拟了一个USB32 CDC串口设备。

arm_fan的专栏 1885

Redis的数据结构之SDS及常用API

Redis的数据结构之SDS Redis没有使用C语言风格的字符串, 而是使用了一种叫SDS的简单动态字符串。 C风格的字符串用来作为字符串字面量, 比如打印日志。当表示一个可以被修改的字符串的时候, redis会用SDS表示。 redis是key_value型数据库, 它的key和value都是一个对象。 SDS除了保存数据库中的字符串外还用作缓冲区(buffer): AOF模块中的A...

Cyrus_wen的博客 646

微信小程序 - 详细解决map地图上使用自定义图标图片或自定义样式进行markers标记点,手机真机运行时安卓系统、苹果ios系统会出现不显示标记点的问题(大概率安卓正常显示标记点,但苹果就加载失败)

微信小程序,map,地图组件,安卓android,苹果ios,真机调试,marker,标记点,在地图上标记,突然就不显示白屏了没动代码,自定义标记点icon,label动态数字,小程序地图markers标记点显示不出来,微信小程序map组件,地图加载后marker标记点ios设备不显示,android正常显示,添加多个标记点。安卓能正常显示标记点图标,IOS设备不显示标记点图标,map地图白屏不显示标记,图标真机调试不显示,自定义图标,报错,页面白屏,不报错也不显示,无法加载,图片展示不出来,iconPat

✅ 精选推荐文章 5954

redis源码分析(2)——SDS API详解

源码分析章节,我尽量使用原生的redis源码,不去看黄建宏的注释,提高自己阅读源码的能力,此外,redis版本还是3.0 源码下载,大家可以到这 http://download.redis.io/releases/ sdsnewtypedef char *sds;sds sdsnewlen(const void *init, size_t initlen) { struct sdshd

李余通的博客 690

【连接器专题】 EIA-364 系列标准的完整列表

EIA-364 系列标准在电子工业中具有重要的地位,为电子连接器和互连系统的测试和验证提供了统一的、可操作的流程和方法,有助于提高电子产品的质量和可靠性,促进了电子工业的发展

一点硬件 2650

【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)

在游戏发展史上,有些游戏以其简单而耐玩的特性,深深地烙印在了玩家的记忆中。《黄金矿工》就是其中之一,它曾经在4399等游戏平台上掀起了一股游戏热潮。这款游戏不仅给无数玩家带来了欢乐,还让他们体验到了挖掘金矿的刺激与乐趣。在这个项目中,我们将花费半天的时间,利用Unity引擎,重新打造这款经典小游戏。通过复刻《黄金矿工》,我们不仅是在向童年的回忆致敬,更是在挖掘游戏设计的精髓。在这个过程中,我们将学习如何实现游戏的核心玩法,设计简洁而有效的游戏机制。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2900

Redis源代码分析之五:简单动态字符串——Sds

一个Redis字符串的结构体定义是: struct sdshdr { int len; int free; char buf[]; }; 其中buf字符数组中储存实际的字符串。len变量保存字符串的长度。free变量指出还有多少字节可用。 sds被定义为一种新的数据类型,实际就是字符指针: typedef char *sds; 例如,sdsnewlen

Aegeaner的专栏 2431

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

动态字符串SDS的实现 | 自己实现Redis源代码(1)

通过对《Redis设计与实现》一书的学习,我打算动手自己实现一份“Redis源代码”作为自己的学习记录。 对Redis感兴趣的同学可以查看我的另一篇文章 造个轮子 | 自己动手写一个Redis。 本章介绍的是Redis源代码中的动态字符串SDS的实现。 动态字符串SDS的实现 SDS的API (1)创建一个包含给定c字符串的sds sds...

weixin_34342207的博客 158

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Redis SDS底层源码解析:C字符串缺陷与内存优化设计

字符串是编程世界中最基础的数据结构,但在高性能场景下,传统C字符串的O(n)长度计算、缓冲区溢出、二进制不安全以及频繁内存重分配等问题成为致命瓶颈。Redis作为内存数据库,通过自研SDS(Simple Dynamic String)数据结构,以len、alloc、buf三段式布局解决了这些痛点,实现了O(1)长度获取、二进制安全存储,并借助空间预分配与惰性释放策略大幅减少内存操作开销。其按长度分级的sdshdr结构,巧妙利用packed压缩内存占用,体现了极致的内存优化哲学。从SET/GET到APPEND

weixin_28683689的博客 140

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Redis学习(1)-SDS

文章目录前言一、SDS的定义二、区别及优点三、SDS的API以及源码1.sdsnewlen2.sdsnew3.sdsempty4.sdslen 前言 一、SDS的定义 Redis没有直接使用C语言传统的字符串表示(以下简称字符串),使用的是一种叫简单动态字符串(simple dynamic string)的类型。 sds.h/sdshdr结构表示SDS值 如下 struct sdshdr { // buf 中已使用的长度 int len; // buf 中剩余可用空间的长

smy166153的博客 421

01 关于 sds

前言 关于 redis 的数据结构 sds 相关介绍主要围绕着如下测试用例, 来看看 sds 的存储, 以及 相关的 api 本文的 sds 相关代码 拷贝自 Redis 2.9.11 (1ce33fe5/1) 64 bit 测试用例 测试用例如下, 呵呵 我们一个一个的来 // // Created by Jerry.X.He on 2021-02-13. // #include <iostream> #include "libs/sds.h" using ...

970655147的专栏 864

Redis深入浅出——字符串和SDS

一、字符串 字符串的类信息定义 1.1 字符串介绍 字符串是Redis中最为常见的数据存储类型,其底层实现是简单动态字符串sds(simple dynamic string),是可以修改的字符串。 它类似于Java中的ArrayList,它采用预分配冗余空间的方式来减少内存的频繁分配。 如图中所示,内部为当前字符串实际分配的空间 。其中capacity是最大容量,len是实际长度...

我的博客 2万+

Redis数据结构之——sds

Redis数据结构之——sds

weixin_46935110的博客 5771

redis源码之sds

sds是redis中一个很重要的数据结构,今天看学一下它源码的实现。 typedef char *sds; /* Note: sdshdr5 is never used, we just access the flags byte directly. * However is here to document the layout of type 5 SDS strings...

1万+

Redis SDS 详解

最近在做插件开发的过程中发现经常有朋友问到tabs和activeTab权限有什么区别,该如何使用,好像不申请tabs或者activeTab也能使用该权限。可以看到,没有主机权限时,是获取不到title,favIconUrl及url的。可以看到能够获取到所有的favIconUrl、url、及title信息。此时我打开了https://github.com/3. 当permission中有tabs权限时。所有activeTab这个权限没有任何作用吗?可以看到什么信息都获取不到。

qq_44285141的博客 1252

【Redis】一、Redis的简单动态字符串SDS

Redis没有直接使用C语言传统的字符串表示(以空字符 \0 结尾的字符数组),而是构建了一种名为简单动态字符串SDS的抽象类型,并将SDS用作Redis的默认字符串表示。 SDS的数据结构 struct sdshdr{ //记录buf数组中已经使用字节的数量 //等于SDS所保存字符串长度 int len; //记录buf数组中未使用字节数量 int free; //字节数组 用...

石臻说AI(szzdzhp001) 【原名 石臻臻的杂货铺】 4500

Redis 中简单动态字符串(SDS)的深入解析

SDS 是 Redis 默认的字符表示,用于保存数据库中的字符串值。它不仅可以存储文本数据,还能存储任意格式的二进制数据,如图片、视频等。同时,SDS 还被用作缓冲区,例如 AOF 模块的 AOF 缓冲区以及客户端状态中的输入缓冲区。

qq_69304031的博客 1392

【Redis】SDS 与 C 字符串的区别

SDS 与 C 字符串的区别 根据传统, C 语言使用长度为N+1的字符数组来表示长度为N的字符串, 并且字符数组的最后一个元素总是空字符'\0'。 比如说, 图 2-3 就展示了一个值为"Redis"的 C 字符串: C 语言使用的这种简单的字符串表示方式, 并不能满足 Redis 对字符串在安全性、效率、以及功能方面的要求, 本节接下来的内容将详细对比 C 字符串和 ...

最怕一生碌碌无为,还安慰自己平凡可贵 2万+

redis SDS介绍

Redis面试中经常被问到,Redis效率为什么这么快,很多同学往往回答: ① Redis基于内存操作 ② Redis是单线程的,采用了IO多路复用技术 ③ Redis未使用C语言字符串,使用了SDS字符串 然而,很少有人能说清楚SDS字符串到底是什么,为什么使用SDS字符串比使用C语言字符串效率要高。 redis字符串(String)内存结构 字符串对象底层数据结构实现为简单动态字符串(SDS)和直接存储,但其编码方式可以是int、raw或者embstr,区别在于内存结构的不同。 1. int.

选择与努力 2392

Redis学习笔记(五)--Redis底层数据结构之简单动态字符串SDS

本文介绍了Redis底层的数据结构简单动态字符串SDS的原理,为作者在学习Rdis时的笔记,特此比记录,以便后续学习中能够查漏补缺。

Scr1Pt的博客 1412
上一篇: MySQL EXPLAIN 命令详解
下一篇: Win10 安装 pandoc 并通过 Typora 导出 PDF
Future_LL
博客等级 码龄9年 215粉丝 255原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值