redis 数据结构 简单动态字符串和链表
2018-03-03 12:10
471 查看
假期在家,看了《Redis 设计与实现》,将其整理成了md。
想来,有两个月左右没有写博客了,将笔记作为一个系列更上来
简单动态字符串(simple dinamic string,即sds) 用来替代c的字符串实现
结构:
要点:
buf[]的大小
使用sds,而不使用string的好处
redis内的使用
链表
结构:
要点
redis内使用
在len和free的计数中,并不包含’\0’,也就是说,设buf[]的大小为10,若有字符串”li qiang\0”,len=8,free=1;
当存储的数据(len)大于等于1MB时,预分配的空间(free)为1MB,这时,buf[]的大小为,len+free+1byte
因为减少了内存操作,有进一步的封装,进而可以避免一些可以造成内存泄漏问题的操作
在结构体内还是用了char的数组,还可以复用一部分string的方法
可以在o(1)的复杂度内获取一些常用的信息
二进制安全:c的string会把’\0’输入结束的标志,这样,对于长文本和字节数据,存储会有问题,而使用sds的leh和buf[],可以确认buf[]的真正结束在哪里,进而可以存储任何数据的二进制字节表示
想来,有两个月左右没有写博客了,将笔记作为一个系列更上来
简单动态字符串(simple dinamic string,即sds) 用来替代c的字符串实现
结构:
要点:
buf[]的大小
使用sds,而不使用string的好处
redis内的使用
链表
结构:
要点
redis内使用
简单动态字符串(simple dinamic string,即sds) 用来替代c的字符串实现
结构:
struct sdshdr{ int len;//表示有用数组的长度 int free;//表示空闲数组的长度 char buf[];//真正存储字符串的数组 }
要点:
buf[]采用和c中表示string一样的表示方法,即以’\0’结尾,这样可以复用部分c的string函数,在len和free的计数中,并不包含’\0’,也就是说,设buf[]的大小为10,若有字符串”li qiang\0”,len=8,free=1;
buf[]的大小
当存储的数据(len)小于1MB时,预分配的空间(free),与len相等,这时,buf[]的大小=2*len+1byte=2*free+1byte=len+free+1byte.(+1是因为\0存在)当存储的数据(len)大于等于1MB时,预分配的空间(free)为1MB,这时,buf[]的大小为,len+free+1byte
使用sds,而不使用string的好处
避免重复的申请、删除内存空间:buf[]的使用可以通过len和free进一步控制,可以降低对内存的申请,内存操作是内核指令,较为耗费性能因为减少了内存操作,有进一步的封装,进而可以避免一些可以造成内存泄漏问题的操作
在结构体内还是用了char的数组,还可以复用一部分string的方法
可以在o(1)的复杂度内获取一些常用的信息
二进制安全:c的string会把’\0’输入结束的标志,这样,对于长文本和字节数据,存储会有问题,而使用sds的leh和buf[],可以确认buf[]的真正结束在哪里,进而可以存储任何数据的二进制字节表示
redis内的使用
基本所有用于表示可能修改的字符串的地方都是sds,c的字符串只用来表示一些不必修改的数据,比如日志链表
redis的链表是双向链表,并且,在使用链表节点串起链表之余,redis还是用了一个list的结构体,内部存储链表head,tail和删除,比较,复制链表节点的方法,以及节点个数.
结构:
typedef struct listNode{ struct listNode * prev;//前继 struct listNode * next;/后续 void * value;//值 } typedef struct list{ listNode * head; listNode * tail; unsigned long len; void (*dup)(void *ptr); void (*free)(void *ptr); void (*match)(void *ptr); }
要点
value为void类型,意味可保存任何类型redis内使用
甚多,列表的存储,订阅与发布功能的实现,慢查询,监视器相关文章推荐
- Redis-数据结构-1-简单动态字符串
- Redis底层数据结构之简单动态字符串
- Redis数据结构(一)简单动态字符串
- redis的数据结构和对象(1.简单的动态字符串- simple dynamic string)
- redis内部数据结构之SDS简单动态字符串详解
- redis内部数据结构--简单动态字符串sds
- Redis内部数据结构详解之简单动态字符串(SDS)
- redis 笔记01 简单动态字符串、链表、字典、跳跃表、整数集合、压缩列表
- Redis的简单动态字符串SDS、链表
- Redis内部数据结构详解之简单动态字符串(sds)
- redis数据结构-简单动态字符串(sds)
- Redis之简单动态字符串&链表
- redis数据结构之一-简单动态字符串SDS
- Redis内部数据结构详解之简单动态字符串(sds)
- redis 系列3 简单动态字符串 SDS
- Redis -- 1、简单动态字符串(sds)
- Redis深入理解-数据结构篇(1)-简单动态字符串SDS
- C 工具库 GLib --- 提供多种高级的数据结构,如内存块、双向和单向链表、哈希表、动态字符串等
- Redis源码解析:01简单动态字符串SDS
- Redis源码剖析--简单动态字符串sds