redis数据结构的底层实现(上)

1、演示数据类型的实现

OBJECT ENCODING    key

该命令是用来显示那五大数据类型的底层数据结构。

比如对于 string 数据类型:
  


string11.png

我们可以看到实现string数据类型的数据结构有 embstr 以及 int。

再比如 list 数据类型:
  


string22.png

2、简单动态字符串
  
  第一篇文章我们就说过 Redis 是用 C 语言写的,但是对于Redis的字符串,却不是 C 语言中的字符串(即以空字符’\0’结尾的字符数组),它是自己构建了一种名为 简单动态字符串(simple dynamic string,SDS)的抽象类型,并将 SDS 作为 Redis的默认字符串表示。
  
  SDS 定义:

struct sdshdr{
     //记录buf数组中已使用字节的数量
     //等于 SDS 保存字符串的长度
     int len;
     //记录 buf 数组中未使用字节的数量
     int free;
     //字节数组,用于保存字符串
     char buf[];
}

用SDS保存字符串 “Redis”具体图示如下:

SDS.png

我们看上面对于 SDS 数据类型的定义:

1、len 保存了SDS保存字符串的长度

2、buf[] 数组用来保存字符串的每个元素

3、free j记录了 buf 数组中未使用的字节数量
  
  C语言由于不记录字符串的长度,所以如果要修改字符串,必须要重新分配内存(先释放再申请),因为如果没有重新分配,字符串长度增大时会造成内存缓冲区溢出,字符串长度减小时会造成内存泄露。

而对于SDS,由于len属性和free属性的存在,对于修改字符串SDS实现了空间预分配和惰性空间释放两种策略:

1、空间预分配:对字符串进行空间扩展的时候,扩展的内存比实际需要的多,这样可以减少连续执行字符串增长操作所需的内存重分配次数。

2、惰性空间释放:对字符串进行缩短操作时,程序不立即使用内存重新分配来回收缩短后多余的字节,而是使用 free 属性将这些字节的数量记录下来,等待后续使用。(当然SDS也提供了相应的API,当我们有需要时,也可以手动释放这些未使用的空间。)
  


C与SDS的区别.png

这次就先分享到这里,更多干货和资料请直接联系我,也可以加群710520381,邀请码:柳猫,欢迎大家共同讨论

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站...
    小陈阿飞阅读 813评论 0 1
  • Redis数据库里面的每个键值对(key-value pair)都是由对象(object)组成的: 其中,数据库键...
    one_zheng阅读 606评论 0 0
  • Redis使用的是自己构建的简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将...
    但莫阅读 518评论 0 0
  • 这个世界真静 连自己的心跳听得见 风对叶子说 随我走 我可以带你看 外面精彩的世界 叶子深情地望着树 随风走了……...
    韵芳阅读 383评论 1 3
  • 绘制思路: 中心图的美人鱼,比较胖,肚皮比较突出,代表我的姓“杜” 最近比较火的电影 美人鱼 首先可以想到星爷 然...
    文魁大脑杜星默阅读 675评论 0 51