简单动态字符串

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

旧街凉风 提交于 2020-03-26 12:11:40
3 月,跳不动了?>>> 上一篇,讲了基本的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; } 同样,在这个头文件中

Redis字符串类型实现内幕

微笑、不失礼 提交于 2019-12-03 06:08:07
摘要 Redis不仅仅是一个key-value存储,它更是一个数据结构服务,支持不同类型的值。这意味着在传统的key-value存储中,我们用string的key关联string的value。而在Redis中,我们可以存储的值不受限于string,我们还可以存储复杂的数据结构。string是我们在使用Redis过程中能接触到的最简单的数据类型,也是Memcached中仅有的类型,因此对于Redis新手来说,首先选择使用string类型是理所当然的。这篇文章主要介绍Redis的string类型的实现内幕。 初识:简单动态字符串 Redis中使用的字符串是通过包装的,基于c语言字符数组实现的一个抽象数据结构,后文中提到的sds指的就是简单动态字符串,它的定义和实现在sds.h和sds.c中,结构是这样的: struct sdshdr { int len; int free; char buf[]; }; Redis中定义了这样一个结构体来表示字符串,字段含义如下: len表示buf中存储的字符串的长度。 free表示buf中空闲空间的长度。 buf用于存储字符串内容。 举个例子: 图1 假设上面图1是当前buf中存储的内容,那么这个时候len为8,free为2,sds的内存占用量可以用下面公式表示: sizeof(struct sdshdr) + len + free + 1