Redis源码阅读-sds字符串源码阅读
redis使用sds代替char *字符串,
其定义如下:
typedef char *sds;
struct sdshdr {
unsigned int len;
unsigned int free;
char buf[];
};
sds指向了char 字符串
sdshdr是字符串头
结构比较巧妙
使用char buf[]存放字符串实际内容
注意char *buf和char buf[]是不同的
sizeof(sdshdr)等于8,而不是我以为的12
连续内存结构如下:
0----7 sdshdr
8----以后 sds ,同时也是buf位置
建立sds的方法
sds sdsnewlen(const void *init, size_t initlen) {
struct sdshdr *sh;
if (init) {
sh = zmalloc(sizeof(struct sdshdr)+initlen+);
} else {
sh = zcalloc(sizeof(struct sdshdr)+initlen+);
}
if (sh == NULL) return NULL;
sh->len = initlen;
sh->free = ;
if (initlen && init)
memcpy(sh->buf, init, initlen);
sh->buf[initlen] = '\0';
return (char*)sh->buf;
}
释放sds的方法
void sdsfree(sds s) {
if (s == NULL) return;
zfree(s-sizeof(struct sdshdr));
}
注意sds指向的是实际的字符串,而不是sdshdr。
在sds.c里面有很多对sds字符串进行处理的函数,(毕竟为了取代char *)
|
函数名称 |
作用 |
复杂度 |
|
sdsnewlen |
创建一个指定长度的sds,接受一个指定的C字符串作为初始化值 |
O(N) |
|
sdsempty |
创建一个只包含空字符串””的sds |
O(N) |
|
sdsnew |
根据给定的C字符串,创建一个相应的sds |
O(N) |
|
sdsdup |
复制给定的sds |
O(N) |
|
sdsfree |
释放给定的sds |
O(1) |
|
sdsupdatelen |
更新给定sds所对应的sdshdr的free与len值 |
O(1) |
|
sdsclear |
清除给定sds的buf,将buf初始化为””,同时修改对应sdshdr的free与len值 |
O(1) |
|
sdsMakeRoomFor |
对给定sds对应sdshdr的buf进行扩展 |
O(N) |
|
sdsRemoveFreeSpace |
在不改动sds的前提下,将buf的多余空间释放 |
O(N) |
|
sdsAllocSize |
计算给定的sds所占的内存大小 |
O(1) |
|
sdsIncrLen |
对给定sds的buf的右端进行扩展或缩小 |
O(1) |
|
sdsgrowzero |
将给定的sds扩展到指定的长度,空余的部分用\0进行填充 |
O(N) |
|
sdscatlen |
将一个C字符串追加到给定的sds对应sdshdr的buf |
O(N) |
|
sdscpylen |
将一个C字符串复制到sds中,需要依据sds的总长度来判断是否需要扩展 |
O(N) |
|
sdscatprintf |
通过格式化输出形式,来追加到给定的sds |
O(N) |
|
sdstrim |
对给定sds,删除前端/后端在给定的C字符串中的字符 |
O(N) |
|
sdsrange |
截取给定sds,[start,end]字符串 |
O(N) |
|
sdscmp |
比较两个sds的大小 |
O(N) |
|
sdssplitlen |
对给定的字符串s按照给定的sep分隔字符串来进行切割 |
O(N) |
Redis源码阅读-sds字符串源码阅读的更多相关文章
- Redis学习——SDS字符串源码分析
0. 前言 这里对Redis底层字符串的实现分析,但是看完其实现还没有完整的一个概念,即不太清楚作者为什么要这样子设计,只能窥知一点,需要看完redis如何使用再回头来体会,有不足之处还望告知. 涉及 ...
- [Redis源码阅读]sds字符串实现
初衷 从开始工作就开始使用Redis,也有一段时间了,但都只是停留在使用阶段,没有往更深的角度探索,每次想读源码都止步在阅读书籍上,因为看完书很快又忘了,这次逼自己先读代码.因为个人觉得写作需要阅读文 ...
- redis 5.0.7 源码阅读——动态字符串sds
redis中动态字符串sds相关的文件为:sds.h与sds.c 一.数据结构 redis中定义了自己的数据类型"sds",用于描述 char*,与一些数据结构 typedef c ...
- Redis源码学习:字符串
Redis源码学习:字符串 1.初识SDS 1.1 SDS定义 Redis定义了一个叫做sdshdr(SDS or simple dynamic string)的数据结构.SDS不仅用于 保存字符串, ...
- Redis 数据结构-字符串源码分析
相关文章 Redis 初探-安装与使用 Redis常用指令 本文将从以下几个部分进行介绍 1.前言 2.常用命令 3.字符串结构 4.字符串实现 5.命令是如果操作字符串的 前言 平时在使用 Redi ...
- redis源码之SDS
1:SDS介绍 我们在redis中执行命令 set key name 的时候,key和name都是字符串类型,而且字符串(string)在redis中是会经常用到的类型,那redis是如何保存字符串的 ...
- 【 js 基础 】【 源码学习 】backbone 源码阅读(二)
最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(source-code-study)进行参考交流,有详细的源码注释,以及知识总结,同时 ...
- 教你阅读 Cpython 的源码(二)
第二部分:Python解释器进程 在上节教你阅读 Cpython 的源码(一)中,我们从编写Python到执行代码的过程中看到Python语法和其内存管理机制. 在本节,我们将从代码层面去讨论 ,Py ...
- daily news新闻阅读客户端应用源码(兼容iPhone和iPad)
daily news新闻阅读客户端应用源码(兼容iPhone和iPad),也是一款兼容性较好的应用,可以支iphone和ipad的阅读阅读器源码,设计风格和排列效果很不错,现在做新闻资讯客户端的朋友可 ...
随机推荐
- Function——记忆化搜索
题目描述 对于一个递归函数w(a,b,c) 如果a<=0 or b<=0 or c<=0就返回值1. 如果a>20 or b>20 or c>20就返回w(20,2 ...
- CV3
Self Assessment: 1. Skilled in developing with HTML/JavaScript/ASP.NET/C#, experienced in 3-l ...
- [CTF]Capture The Flag -- 夺旗赛
CTF(Capture The Flag) 简单介绍 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式. `In co ...
- 如何隐藏 video 元素的下载按钮
1. 使用 video 元素的 ControlList API <video controls controlsList="nodownload"></video ...
- Oracle、SQLServer、ArcSDE怎么查看版本、补丁
http://blog.csdn.net/linghe301/article/details/6712544
- ubuntu安装KVM
1. vmware安装ubuntu-14.04.1-server-amd64.iso.2. 安装完成后关机--右键虚拟机--setting--hardware--Processors--将 virtu ...
- Kyle 的 iOS 面试题
1.简单介绍下你对swizzling方法的了解,一般你什么时候使用. 2.有三个对象 A,B,C..:A retain B, B retain C, C retain B..当 A release B ...
- C语言中不同类型的数据转换规则
不同类型数据间的混合运算与类型转换 1.自动类型转换 在C语言中,自动类型转换遵循以下规则: ①若参与运算量的类型不同,则先转换成同一类型,然后进行运算 ②转换按数据长度增加的方向进行,以保证精度不降 ...
- rabbitmq集群节点操作
节点恢复过程中把数据删掉很重要,恢复一单结点,再清数据 节点增加: 1. rabbitmq-server -detached --- .erlang.cooike的权限,400 属主rabbitm ...
- 【Hadoop】Hadoop 机架感知配置、原理
Hadoop机架感知 1.背景 Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份, 同机架内其它某一节点上一份,不同机架的某一节点上一份. 这样如果本地 ...