文档章节

Redis研究-2.简单动态字符串操作

会飞的杨先生
 会飞的杨先生
发布于 2015/08/24 14:07
字数 1005
阅读 493
收藏 3
点赞 0
评论 0

上一篇,讲了基本的Redis为什么要使用自己的SDS,以及使用SDS带来的好处,这一篇主要说说针对这个SDS,Redis封装了哪些操作,在看封装的函数之前,先看一下sds.h里面的一个申明:typedef char *sds;这个申明,在Redis的SDS中启到了非常重要的作用,这个字符指针是用于指向 sdshdr 的 buf 属性。因此,如果你要根据这个sds指针来求出SDS的首地址,你应该使用(s-(sizeof(struct sdshdr )))的方式就能得到。

在sds.h中定义了两个局限于本文件使用的两个函数,分别是获得sdshdr的len属性值,以及获得sdshdr的free值,分别是:


获得sdshdr的len属性
static inline size_t sdslen(const sds s) {
    struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
    return sh->len;
}
获得sdshdr的free属性
static inline size_t sdsavail(const sds s) {
    struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
    return sh->free;
}




同样,在这个头文件中,申明了很多函数,分别是:

sds sdsnewlen(const void *init, size_t initlen);//用指定的char *字符指针和指定的长度来创建一个Redis sds
sds sdsnew(const char *init);//用指定的char *init 来创建一个Redis sds
sds sdsempty(void);//创建一个空的Redis sds
size_t sdslen(const sds s);
sds sdsdup(const sds s);//使用指定的sds来创建一个副本,是使用sdsnewlen来创建的副本
void sdsfree(sds s);//释放给定的sds,用到zfree,这个函数申明在zmalloc.h中,在zmalloc.c中实现
size_t sdsavail(const sds s);
sds sdsgrowzero(sds s, size_t len);//将 sds 扩充至指定长度,未使用的空间以 0 字节填充
sds sdscatlen(sds s, const void *t, size_t len);//将长度为len的字符串t,添加到sds的末尾
sds sdscat(sds s, const char *t); //将给定字符串t添加到sds的末尾
sds sdscatsds(sds s, const sds t);//将一个sds追加到另一个sds末尾
sds sdscpylen(sds s, const char *t, size_t len);//将字符串t的前len个字符追加到sds末尾
sds sdscpy(sds s, const char *t);//将字符串t复制到sds中

sds sdscatvprintf(sds s, const char *fmt, va_list ap);//打印函数
#ifdef __GNUC__
sds sdscatprintf(sds s, const char *fmt, ...)
    __attribute__((format(printf, 2, 3)));//
#else
sds sdscatprintf(sds s, const char *fmt, ...);//打印人一个字符串,并将字符串添加到sds的末尾
#endif

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,按照闭区间的索引来截取
void sdsupdatelen(sds s);//重分配len和free
void sdsclear(sds s);//在不释放sds的空间的情况下,将sds保存的内容重置为空字符
int sdscmp(const sds s1, const sds s2);//比较两个sds
sds *sdssplitlen(const char *s, int len, const char *sep, int seplen, int *count);//用分隔符sep来分割s
void sdsfreesplitres(sds *tokens, int count);//释放sds数组中的count个sds
void sdstolower(sds s);//将sds中的内容转化为小写
void sdstoupper(sds s);//将sds中的内容转化为大写
sds sdsfromlonglong(long long value);//根据输入的long long value值来创建一个sds
sds sdscatrepr(sds s, const char *p, size_t len);//将长度为len的字符串p,用引号的方式添加到sds末尾
sds *sdssplitargs(const char *line, int *argc);//将一行文本分割为多个参数
sds sdsmapchars(sds s, const char *from, const char *to, size_t setlen);//将s中在from出现的字符替换为to中的字符
sds sdsjoin(char **argv, int argc, char *sep);//将一个c字符串的数组用指定的分隔符sep添加到sds中

/* Low level functions exposed to the user API */
sds sdsMakeRoomFor(sds s, size_t addlen);//对sds中的buf进行长度扩展
void sdsIncrLen(sds s, int incr);//根据incr来扩展sds的长度,所见空余空间
sds sdsRemoveFreeSpace(sds s);//回收sds中的空余空间
size_t sdsAllocSize(sds s);//返回给定的sds的已经分配的空间的字节数






© 著作权归作者所有

共有 人打赏支持
会飞的杨先生
粉丝 9
博文 14
码字总数 30689
作品 0
昆明
CTO(技术副总裁)
Redis设计思路学习与总结

版权声明:本文由宋增宽原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/222 来源:腾云阁 https://www.qcloud.com/community 宋增宽,腾讯工程师,16年...

偶素浅小浅
2016/12/11
25
0
Redis源码分析系列七:initServer下

这个函数快到尾声了,一鼓作气! if(aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL) == AE_ERR) { redisPanic("Can't create the serverCron time event."); exit(1); } 这个函数......

强子哥哥
2013/10/18
0
0
我的架构演化笔记 10:ElasticSearch的分词器之ansj研究

架构不变,为了学习方便,直接研究ElasticSearch-rtf版本。 ~~~ 关于redis---配置文件中指定

强子哥哥
2014/06/11
0
7
研究学习Kotlin的一些方法

Kotlin是一门让人感到很舒服的语言,相比Java来说,它更加简洁,省去了琐琐碎碎的语法工作,同时了提供了类似Lambda,String template,Null Safe Operator等特性。让开发者用起来得心应手。 ...

技术小黑屋
2017/05/08
0
0
Window64位安装Redis及管理工具

1、Redis安装 1.地址:http://www.nuget.org/packages/Redis-64/3.0.500,根据需要安装自己想要的版本 2.Windows安装非常简单,解压文件夹,点击redis-server启动Redis 3.点击redis-client,...

Java_Coder
2015/12/15
154
2
Redis研究-1.简单动态字符串

我们知道,在C字符串中,底层的实现是使用c字符数组来实现的,但是在高性能以及内存安全方面,使用底层的c字符串是满足不了的,举个简单的例子,如果你使用strcat(s,s1)函数,如果在操作之前...

会飞的杨先生
2015/08/24
0
7
Python Celery初研究

最近,换了一个工作环境去做研究,当然啦,新公司新作风,需要研究python并行分布式框架:Celery,不用多说,干呗。 然后就抽空看了一下,果然接口简单,开发容易,5分钟就写出了一个异步发送...

kumikoda
2017/04/03
0
0
【开源】.net 分布式架构之分布式缓存中间件

开源git地址: http://git.oschina.net/chejiangyi/XXF.BaseService.DistributedCache 分布式缓存中间件 方便实现缓存的分布式,集群,负载均衡,故障自动转移,并兼容多种缓存存储的分布式缓...

车江毅
2015/12/31
1K
0
.NET 分布式缓存中间件--XXF.BaseService.DistributedCache

分布式缓存中间件 方便实现缓存的分布式,集群,负载均衡,故障自动转移,并兼容多种缓存存储的分布式缓存中间件。 用于解决分布式架构中的分布式缓存环节。 特点: 代码少,便于扩展。 兼容...

车江毅
2015/12/31
848
1
学习东西总结:

一.JAVA 基础 1、JAVA并发编程 2.JAVA NIO系列 3.JVM深入了解 4.JAVA性能优化相关研究 5.JAVA7,8新特性 二、数据库 1.数据库优化研究 2.MYSQL高可用性研究 3.MYSQL源码研究 三、网络 1.HTTP...

QH_C
2016/03/25
5
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

前端基础

1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是...

wenxingjun
今天
0
0
Android 复制和粘贴功能

做了一回搬运工,原文地址:https://blog.csdn.net/kennethyo/article/details/76602765 Android 复制和粘贴功能,需要调用系统服务ClipboardManager来实现。 ClipboardManager mClipboardM...

她叫我小渝
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
6
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1
fiddler安装和基本使用以及代理设置

项目需求 由于开发过程中客户端和服务器数据交互非常频繁,有时候服务端需要知道客户端调用接口传了哪些参数过来,这个时候就需要一个工具可以监听这些接口请求参数,已经接口的响应的数据,这种...

银装素裹
今天
0
0
Python分析《我不是药神》豆瓣评论

读取 Mongo 中的短评数据,进行中文分词 对分词结果取 Top50 生成词云 生成词云效果 看来网上关于 我不是药神 vs 达拉斯 的争论很热啊。关于词频统计就这些,代码中也会完成一些其它的分析任...

猫咪编程
今天
0
0
虚拟机怎么安装vmware tools

https://blog.csdn.net/tjcwt2011/article/details/72638977

AndyZhouX
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部