• redis设计与实现(一)简单动态字符串


    redis是C语言实现的,但redis中的字符串并没有直接用C语言中的字符串表示,而是自己构建了一种简单的动态字符串类型(SDS)。

    在redis里面,C字符串只用作字面量,用在一些不会修改的地方,eg:打日志。

    SDS的结构:

    struct sdshdr{
      int free;
      int len;
      char buf[];      
    }

     free 属性值为0 表示这个sds未分配未使用的空间。

     len 属性值为5 表示sds保存一个5字节长度的字符串。

     buf 是char类型数组保存字符串的每个字节,并在字符串结尾增加“”。

    SDS与C字符串区别:

    1,获取字符串长度时,C字符串需要遍历字符串直到找到‘’为止,它的复杂度为O(n),而SDS直接访问len属性就可以直接获取字符串的长度,复杂度为O(1)。

    2,SDS的api杜绝缓存区溢出,SDS调用SdsCat时,会首先判断 sds的空间是否充足,如果不够要先扩展SDS,再进行字符串拼接。

    3,为了减少内存重分配的性能影响,SDS的字符串增长会做内存预分配操作,通过预分配策略,可以有效的减少redis分配内存的次数。

    4,SDS是二进制安全的,C字符串通过判断是否为‘’找字符串结尾,而SDS通过len属性来找字符串结尾,这样就不怕字符串中间有''。

  • 相关阅读:
    1017.陶陶装苹果
    1084.爬楼梯加强版
    1056.A ^ B Problem 快速幂算法。
    1074.我们喜欢递归的斐波那契数列
    1073.我们喜欢递归的阶乘
    1046 没过
    python 基本常用数据类型
    yii2.0 数据库查询操作
    python 随便笔记
    搭建自己的koa+mysql后台模板
  • 原文地址:https://www.cnblogs.com/jasonbourne3/p/11505512.html
Copyright © 2020-2023  润新知