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的阅读阅读器源码,设计风格和排列效果很不错,现在做新闻资讯客户端的朋友可 ...
随机推荐
- luogu P1494 岳麓山上打水
题目描述 今天天气好晴朗,处处好风光,好风光!蝴蝶儿忙啊,蜜蜂也忙,信息组的同学们更加忙.最近,由于XX原因,大家不得不到岳麓山去提水.55555555~,好累啊. 信息组有一个容量为q升的大缸,由于 ...
- 【codevs1907】【方格取数3】二分图最大带权独立集
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59001242 向大(hei)佬(e)势力学(di ...
- unity3d 网页游戏客户端工程构建方案
将一个项目分为两个编辑环境,一个是editor,一个是target. editor只是策划人员拖拖拽拽编辑场景,打包时程序自动将每个场景资源打包生成一个XXX.unity3d文件,并最后生成一个场景配 ...
- 个人博客 V0.0.3 版本 ...
早就想弄个人博客网站,一直拖到现在...事情总是忙不完的,想能力提升的快,只能挤时间多练多写了,Keep On Unsleeping 以后原创的笔记都会在自己的博客网站写,博客园和简书就用来转发文章了 ...
- ife2015-task2-4-5
task2-4.html<!DOCTYPE html><html><head lang="en"> <meta charset=" ...
- 设计模式之适配器模式(php实现)
/* github地址:https://github.com/ZQCard/design_pattern * 适配器模式:将一个类的接口转换成客户希望的另外一个接口. * 适配器模式使得原本由于接口不 ...
- Oracle数据库实现获取前几条数据的方法
如何在Oracle数据库中实现获取前几条数据的方法呢?就是类似SQL语句中的SELECT TOP N的方法.本文将告诉您答案,举例说明了哟! 1.在Oracle中实现SELECT TOP N : ...
- 项目笔记:导出XML和导出全部XML功能
前台代码: //导出一条Xml function btn_createXml(){ var title =$("#editButton").attr("title&quo ...
- 浅谈C#委托和事件(转载)
委托给了C#操作函数的灵活性,我们可使用委托像操作变量一样来操作函数,其实这个功能并不是C#的首创,早在C++时代就有函数指针这一说法,而在我看来委托就是C#的函数指针,首先先简要的介绍一下委托的基本 ...
- 排序效率小PK
上个小demo看看 import com.google.common.primitives.Chars; import java.util.*; /** * java中数组转List使用Arrays. ...