zoukankan      html  css  js  c++  java
  • 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属性来找字符串结尾,这样就不怕字符串中间有''。

  • 相关阅读:
    Mysql 主备原理
    Mysql-innodb日志写入时机
    Innodb 架构
    Reactor/Proactor
    select,poll,epoll,IO多路复用进化史
    从硬件+操作系统的角度解释为什么操作系统的IO单位是磁盘块
    Dubbo 核心功能在业务架构中的体现
    Mysql-Innodb 锁总结
    第一阶段冲刺三
    第一阶段冲刺二
  • 原文地址:https://www.cnblogs.com/jasonbourne3/p/11505512.html
Copyright © 2011-2022 走看看