码迷,mamicode.com
首页 > 其他好文 > 详细

Redis 专题一: 数据结构

时间:2015-08-27 13:23:16      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:redis

简单的动态字符串

  • redis没有直接使用C语言传统的字符串表示,而自己构建了一个动态字符串SDS,当redis需要的不仅仅是一个字符串字面量,而是一个可以被秀噶ide字符串值时,redis就会使用sds来表示字符串值,比如在redis的数据库里,包含字符串值的键值对在底层都是由SDS实现的。
redis  > set name "bugall"
ok
1.键值对的键是一个字符串对象,对象的底层实现是一个保存着字符串"name"的SDS
2.键值对的值也是一个字符串对象,对象的底层实现是一个保存这字符串"bugall"的SDS
  • 除了用来保存数据库中的字符串值之外,SDS还被用作缓冲区,AOF模块中的AOF缓冲区,以及客户端状态中的输入缓冲区。
    技术分享
struct sdshdr{
    //记录buf数组中已使用字节的数量
    //等于SDS所保存字符串的长度
    int len;
    //记录buf数组中未使用字节的数量
    int free;
    //字节数组,用于保存字符串
    char buf[];
}
1. free属性的值为0,表示这个SDS没有分配任何未使用空间。
2. len属性的值为5,表示这个SDS保存了一个五字节长的字符串
3. buf属性是一个char类型数组,数组的前5个字节分别保存了‘r‘,‘e‘,‘d‘,‘i‘,‘s‘五个字符,而最后一个字节则保存了空字符‘\0‘

注意:保存孔子福的1字节空间不计算在SDS的len属性里面,并且为空字符分配额外的一字节空间。
  • 与c字符串不同,SDS的空间分配策略完全杜绝了发生缓冲区溢出的可能性,当SDS api 需要对SDS进行修改时,API 会先检查SDS的空间是否满足修改所需要的要求,如果不满足的话,API会自动将SDS的空间拓展至执行修改所需要的大小,然后才执行实际的修改操作,所以使用SDS即不需要手动修改SDS的空间大小,也不会出现的缓冲区溢出的情况。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Redis 专题一: 数据结构

标签:redis

原文地址:http://blog.csdn.net/bugall/article/details/48025829

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!