ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

redis数据存储结构

2020-01-26 10:53:54  阅读:245  来源: 互联网

标签:存储 字节 SDS redis 使用 字符串 buf 结构


1.redis中以key-value的形式存储,key固定是字符串,使用字符串对象进行表示,value可以是字符串(String)、列表(List)、哈希(Hash)、集合(Set)、有序集合(ZSet)。

2.在内存中,每个Key-Value都被划分成DictEntry、RedisObject以及具体对象,DictEntry又分别包含指向Key和Value的指针,以及指向下一个DicEntry的指针,指向key和value的指针也是以RedisObject的形式

3.redis使用了自定义的字符串类型,不同于C语言的字符串,redis使用sdshdr结构来表示字符串对象(SDS)

struct sdshdr {

  int len;

  int free;

  char buf[];

}

len属性:字符串的长度

free属性:未使用的字节数量

buf数组:字符串的底层实现用于存储字符

buf数组中会有\0空字符,该空字符不会记录在len属性中

C语言中存储的字符串的字节数组长度是其总长度的N+1,因为最后一个是结束符,所以如果要对字符串进行追加,需要重新分配内存,redis的SDS通过未使用空间解除了字符串长度和底层数组长度之间的关系,在SDS中buf的长度不一定就是字符串长度+1,数组里面还可以包含未使用的字节,通过这种未只用的空间,SDS就实现了空间预分配和惰性空间释放两种策略,减少由于字符串修改导致的内存重新分配的次数。

空间预分配是用于优化SDS保存的字符串的增长操作,当需要对SDS保存的字符串进行增长操作时候,程序除了会分配必须的空间外,还会为SDS分配额外的未使用空间

惰性空间释放用于优化SDS保存的字符串缩短操作,当需要对SDS保存对字符串进行缩短操作时候,程序不会立即使用内存重分配来回收缩短后多出来的字节,而是使用free属性将这些多出来的字节数量记录下来,等待将来使用。

 

标签:存储,字节,SDS,redis,使用,字符串,buf,结构
来源: https://www.cnblogs.com/wangflower/p/12233858.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有