Redis开源代码读书笔记六(sds模块)

2023-05-16

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 s, size_t addlen);
扩充sds s字符串尾部空余字节。扩充规则是原sds s字符串两倍或者sds s长度加上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 s, const char *fmt, va_list ap);
将格式化字符串追加到sds字符串末尾

int sdsll2str(char *s, long long value)
long long类型转化为字符串的函数,这里写死了LLSTR长度为21个字符,主要是longlong的范围最大是20位,加上一个NULL,正好是21位。

long long的最大值: 9223372036854775807  -- 19位
long long的最小值:-9223372036854775808  -- 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);
释放sdssplitlen,sdssplitargs分割出来的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字符串
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis开源代码读书笔记六(sds模块) 的相关文章

  • Session、Token、Jwt、Oauth2 区别和原理详解

    1 认证 xff08 Authentication xff09 通俗的说就是验证当前用户的身份 xff0c 证明你是你自己 2 授权 xff08 Authorizatio xff09 用户授予第三方应用访问该用户某些资源的权限 实现授权的方
  • ArduPilot飞控之DIY-F450计划

    ArduPilot飞控之DIY F450计划 1 历史2 源由3 计划3 1 硬件3 2 软件 4 动手4 1 接线4 1 1 ELRS nano接收机4 1 2 BN880 GPS模块4 1 3 Radio Telemetry 4 2 配
  • BN880 GPS u-center_v22.07工具配置方法

    BN880 GPS u center v22 07工具配置方法 1 源由2 分析3 自我实验3 1 测试现象3 2 u center v22 07工具3 3 波特率验证3 4 重新配置3 4 1 PRT Ports 3 4 2 PMS Po
  • Betaflight BN880 GPS 简单测试

    Betaflight BN880 GPS 简单测试 1 源由2 窗台对比测试3 开阔区域测试3 1 GPS安装位置3 1 1 BN880 GPS 机尾打印支架 安装位置3 1 2 BN880 GPS 机头固定 安装位置3 1 3 M8N G
  • 关于【无人驾驶航空器飞行管理暂行条例】对航模的一些信息讨论&汇总

    关于 无人驾驶航空器飞行管理暂行条例 对航模的一些信息讨论 amp 汇总 1 源由2 讨论3 理解3 1 关于 管理对象 的理解3 2 关于 模型航空器管理规则 的理解3 3 关于 模型航空器 的理解3 4 关于 安全 的理解 4 参考资料
  • ArduPilot Kakute F7 AIO DIYF450 without GPS配置

    ArduPilot Kakute F7 AIO DIYF450 without GPS配置 1 源由2 配置2 1 Kakute F7 AIO相关配置2 1 1 串口规划2 1 2 电传配置2 1 3 GPS配置2 1 4 CRSF接收机配
  • ArduPilot开源飞控系统之简单介绍

    ArduPilot开源飞控系统之简单介绍 1 源由2 了解 amp 阅读2 1 ArduPilot历史2 2 关于GPLv32 3 ArduPilot系统组成2 4 ArduPilot代码结构 3 后续3 1 DIY F4503 2 软件设
  • ArduPilot Kakute F7 AIO DIYF450 之GPS配置

    ArduPilot Kakute F7 AIO DIYF450 之GPS配置 1 源由2 步骤2 1 模块预测试2 2 物理连接2 3 UART配置2 4 Compass使能2 5 GPS使能2 6 校准Compass 3 GPS amp
  • 关于CSDN文章内嵌视频自动播放问题

    关于CSDN文章内嵌视频自动播放问题 1 源由2 分析3 反馈4 沟通5 总结6 附录 Firefox配置7 附录 Microsoft Edge配置 1 源由 这个问题是4月初发现的 xff0c 主要现象就是页面上的视频一起自动播放了 鉴于
  • 关于FPV图传系统时延讨论

    关于FPV图传系统时延讨论 1 源由2 时延测试方法3 时延测试资料4 关于模拟图传5 关于FPV时延感受5 1 静态时延5 2 动态时延 6 参考资料7 附录7 1 When is 120fps NOT 120fps DJI O3 Air
  • ArduPilot之开源代码框架

    ArduPilot之开源代码框架 1 系统框架2 工程框架2 1 工程目录2 2 代码组成2 3 运行流程 4 硬件传感器总线4 1 I2C4 2 SPI4 3 UART4 4 CAN 5 软件设计概念6 总结7 参考资料 在研读ArduP
  • Charles电脑配置和手机配置【超详细,iOS和安卓】

    1 xff0c 电脑安装charles charles的安装非常简单 xff0c 直接通过charles官网安装最新版即可 Charles 是收费软件 xff0c 可以免费试用 30 天 试用期过后 xff0c 未付费的用户仍然可以继续使用
  • vmmem内存占用高

    文章目录 前言通过 wslconfig限制其内存使用 前言 什么时vmmem进程 vmmem进程时在使用vmware时的进程 xff0c 内存占用非常高 我是在使用docker时遇到的这个进程 通过 wslconfig限制其内存使用 这个方
  • QGroundControl之安装调试

    QGroundControl之安装调试 1 源由2 问题汇总2 1 摄像头播放问题2 2 Windows电脑录像和拍照保存位置2 3 Android设备录像和拍照保存位置 3 打包资料4 附录 QGroundControl Video St
  • ArduPilot之posHold&RTL实测

    ArduPilot之posHold amp RTL实测 1 源由2 模式配置3 测试步骤4 飞行实测5 总结6 参考资料7 附录 关于QGC 暂不支持MAVLink2 signing Protocol问题7 1 问题描述7 2 硬件配置7
  • ArduPilot之开源代码Library&Sketches设计

    ArduPilot之开源代码Library amp Sketches设计 1 简介1 1 Core libraries1 2 Sensor libraries1 3 Other libraries 2 源由3 Library Sketche
  • ArduPilot之开源代码Sensor Drivers设计

    ArduPilot之开源代码Sensor Drivers设计 1 源由2 Sensor Drivers设计2 1 front end back end分层2 2 设计思想分析 3 实例理解3 1 驱动初始化3 2 业务应用代码3 3 fro
  • ArduPilot之开源代码基础知识&Threading概念

    ArduPilot之开源代码基础知识 amp Threading概念 1 源由2 基础知识2 1 The timer callbacks2 2 HAL specific threads2 2 1 AP HAL ChibiOS2 2 2 AP
  • ArduPilot之GPS Glitch问题&M8N模块配置

    ArduPilot之GPS Glitch问题 amp M8N模块配置 1 源由2 现象3 视频分析3 1 配置 xff08 不理想 xff09 3 2 配置优化3 3 优化配置 43 短时间 43 3D Lock 43 Glitch3 4
  • BetaFlight统一硬件配置文件研读

    BetaFlight统一硬件配置文件研读 1 源由2 分析2 1 硬件SOC2 2 统一配置文件2 3 cli命令2 4 板级配置主要命令2 4 1 board name2 4 2 manufacturer id2 4 3 resource

随机推荐

  • BetaFlight统一硬件配置文件研读之timer命令

    BetaFlight统一硬件配置文件研读之timer命令 1 源由2 代码分析3 实例分析4 配置情况4 1 AFn配置查表4 2 timer4 3 timer show4 4 timer pin list 5 参考资料 统一硬件配置文件的
  • 自制肥鲨HDO2电源之功率问题

    自制肥鲨HDO2电源之功率问题 1 源由2 分析2 1 电压检测2 2 功率检测 3 思考4 验证4 1 PH50 10400mAh充电宝供电4 2 PH80 20000mAh充电宝供电4 3 总结 5 参考资料 1 源由 前端时间因为肥鲨
  • BetaFlight统一硬件配置文件研读之serial命令

    BetaFlight统一硬件配置文件研读之serial命令 1 源由2 代码分析3 实例分析4 配置情况5 参考资料 统一硬件配置文件的设计是一种非常好的设计模式 xff0c 可以将硬件和软件的工作进行解耦 1 源由 cli命令中seria
  • Mac配置环境变量后所有命令失效(多条解决方案)

    目录 1 xff0c 首先让命令暂时生效 xff0c 但关窗口后不生效了就 2 xff0c 该操作会清空之前配置的bash profile xff0c 来使命令生效 3 xff0c 该操作可保存原来的bash profile的配置 xff0
  • BetaFlight统一硬件配置文件研读之set命令

    BetaFlight统一硬件配置文件研读之set命令 1 源由2 代码分析3 实例分析4 配置情况4 1 set4 2 set parameter name4 3 set parameter name value 5 参考资料 统一硬件配置
  • BetaFlight统一硬件配置文件研读之feature命令

    BetaFlight统一硬件配置文件研读之feature命令 1 源由2 代码分析3 实例分析4 配置情况4 1 feature4 2 feature list4 3 feature feature name4 4 feature feat
  • BetaFlight统一硬件配置文件研读之dma命令

    BetaFlight统一硬件配置文件研读之dma命令 1 源由2 代码分析2 1 cliDma2 2 showDma2 3 cliDmaopt 3 实例分析4 配置情况4 1 dma4 2 dma show4 3 dma device li
  • BetaFlight统一硬件AOCODARC H7DUAL配置文件讨论

    BetaFlight统一硬件AOCODARC H7DUAL配置文件讨论 1 源由2 Review配置3 分析整理3 1 生产商信息3 2 磁力计3 3 气压计3 4 陀螺仪3 5 串口RxTx3 6 板载Flash3 7 模拟OSD MAX
  • BetaFlight Mark4之“妖怪”声音

    BetaFlight Mark4之 妖怪 声音 1 源由2 分析3 数据3 1 配置一3 1 1 妖怪 声音 黑匣子分析 3 2 配置二3 2 1 仅配置调整 xff08 其他不变 xff09 3 2 2 配置调整 43 整体螺丝锁紧 4
  • FileZilla 安装使用指南

    FileZilla是一个FTP开源项目 xff0c 这里介绍下FTP客户端的安装和使用 61 FileZilla客户端下载 61 FileZilla 最新版本下载 首先 xff0c 可以在FileZilla官方网站上找到客户端下载链接 xf
  • Cygwin本地安装

    61 61 61 说明 61 61 61 当前Cygwin的版本是在线安装之后 xff0c 保存在本地后形成的本地版本 当前操作系统是Windows 8 xff0c 本教程仅提供安装Cygwin的方法 61 61 61 安装步骤 61 61
  • win7自动登录进入桌面系统的配置方式

    Win7直接自动进入桌面的方法 61 61 步骤一 xff1a 在打开命令编辑框 xff0c 键入控制命令 61 61 先在Win7中按 Win 43 R 键打开运行对话框或者是点 开始 菜单 xff08 如下图 xff09 xff0c 在
  • VC6下采用ShellExecuteEx提升管理员权限

    bool IsOsVersionVistaOrGreater OSVERSIONINFOEX ovex CHAR szVersionInfo 1024 szVersionInfo 61 39 x00 39 设置参数的大小 xff0c 调用并
  • Redis开源代码读书笔记一(介绍)

    本人一直是C语言走过来的 xff0c 最近闲来无事 xff0c 学习和研究下Redis开源代码 xff0c 并计划随着代码的深入理解做个简单的读书笔记 xff0c 希望和大家一起学习和探讨 当然第一篇仅仅是做个介绍啦 xff0c 可能更多的
  • karate参数使用和设置debug超长延时

    常用参数 1 patch 和 put patch xff1a 只上传其中一部分参数 xff0c 不幂等put xff1a 幂等 xff0c 要上传完整参数体 2 xff0c And Param req 和 And request req P
  • Redis开源代码读书笔记二(源代码及工程结构)

    Redis是一款采用C语言开发的 lt Key Value gt 内存数据存储系统 今天主要3 0 7版本的的源代码和工程结构 xff0c 并初步分解一下Redis内部开发模块及组成 从Makefile文件和其执行过程及输出日志 xff0c
  • Redis开源代码读书笔记三(zmalloc模块)

    模块特性 61 61 支持内存分配配置 61 61 支持线程安全 61 61 支持内存分配失败异常处理流程自定义 61 61 支持字符串复制操作 61 61 支持当前内存大小占用记录 61 61 支持内存碎片化计算 61 61 支持系统内存
  • Redis开源代码读书笔记四(redis-server主程序, redis.c)

    Redis工程代码从 Redis开源代码读书笔记二 xff08 源代码及工程结构 xff09 中可以看出 xff0c 是非常出色的模块化代码 因此 xff0c 从敏捷的角度看 xff0c 是非常易于阅读和增量开发的 由于琐碎时间的原因 xf
  • Redis开源代码读书笔记五(adlist模块)

    adlist功能特性 61 61 支持双链表节点操作 ins del add create dup release search rotate index 61 61 支持双链表iter操作 get release rewind next
  • Redis开源代码读书笔记六(sds模块)

    SDS是一个动态字符串库 xff0c 主要用于字符串操作 SDS模块功能特性 61 61 支持字符串基本操作 new free dup cpy append add trim cmp range split join lower upper