Redis源码学习随笔

为什么80%的码农都做不了架构师?>>>   hot3.png

数据结构

简单动态字符串SDS(Simple Dynamic String)

  • 使用sdshdr结构体保存字符串长度,使获取字符串长度时间复杂度为O(n)
  • 动态空间管理
  • 动态扩张机制(字符串变长后自动触发,假设变长后长度为len)
    • 如果len < 1M,则预留长度也为len;
    • 如果len >= 1M, 则预留长度为1M;
  • 动态缩减机制(也叫惰性空间释放)
    • 字符串长度变小时,不会自动触发,而是留有接口来清除无用空间
  • 代码语法
struct __attribute__ ((__packed__)) sdshdr8 {
   uint8_t len; /* used */
   uint8_t alloc; /* excluding the header and null terminator */
   unsigned char flags; /* 3 lsb of type, 5 unused bits */
   char buf[];
};
  • 使用"struct attribute ((packed)) sdshdr5"来指示编译器不要进行字节对齐
  • flag低3位表示类型,类型跟据最大长度区分,高5位预留
  • 使用s[-1] (s为指向buf的指针)指向flag,多用于判断字符串类型
  • 使用##来拼接宏

双端链表

  • 自带链表长度的双向链表,没有特别之处

字典

跳跃表

整数集合

压缩对象

对象

转载于:https://my.oschina.net/renhc/blog/1798912

你可能感兴趣的:(数据库,数据结构与算法)