Redis5 设计与源码分析 阅读笔记 01

从github上下载redis的源代码,地址为 https://github.com/antirez/redis.git

mac 事先安装了CLion,导入redis源码工程如下,然后切换到redis 6.0 

Redis5 设计与源码分析 阅读笔记 01_第1张图片

第2章 简单动态字符串

实现类为sds.h 和 sds.c 

  struct sds {

        int len; // buf中已占用字节数

        int free;// buf中剩余字节数

        char buf[] ;//  数据空间

   }

 

   

redis 字符串设计优点

1.有单独的统计变量len和free,可以很方便得到字符串长度

2.内容存放在柔性数组buf中

3.有长度统计len存在,读写字符串不用依赖"\0"终止符,保证了二进制安全

len和free各自占用4个字节,总共8个字节

由于有free变量,所以使用字符串时,可以直接判断出是否需要申请空间

字符串扩容 :

  1. 若sds 中剩余空闲长度avail 大于新增内容长度addLen,直接在柔性数组buf末尾追加即可,无需扩容

  2.若sds 剩余空闲长度avail 小于等于新增长度addLen

      len+addLen < 1MB, 则按照新长度2倍扩容

      len + addLen > 1MB,  按照新长度+1MB 扩容

第3章 跳跃表  t_zset.c文件

Redis5 设计与源码分析 阅读笔记 01_第2张图片

   

   每一层都是一个有序链表,查找时,优先从最高层向后查找;到达某节点时,如果next节点大于要查找的值或者next指针

指向NULL,从当前节点下一层继续寻找

  主要用于有序集合ZSet的实现

  查询 ,插入 ,删除平均复杂度都为O(logN)

  1.zset-max-ziplist-entries 128 : zset采用压缩列表时,元素个数最大值,默认值为128

  2.zset-max-ziplist-value  64  : zset采用压缩列表时,每个元素字符串长度最大值,默认值为64

超过以上2个阈值,就把ziplist转化成跳跃表skiplist

zset转化为跳跃表skiplist后,即使元素被逐渐删除,也不会重新转为压缩列表

你可能感兴趣的:(缓存,redis)