redis源码阅读-入门篇

Posted 5ycode

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis源码阅读-入门篇相关的知识,希望对你有一定的参考价值。

准备工作

  • 安装visual studio code

  • 下载地址 https://visualstudio.microsoft.com/zh-hans/vs/

  • fork源码redis源码

  • https://github.com/redis/redis

  • 下载源码(方便注释)

  • 比如我的 git clone https://github.com/yxkong/redis

  • 使用vs code 打开源码

  • 安装插件

  • C/C++

  • C/C++ Extension Pack

  • Better C++ Syntax

  • GitLens — Git supercharged

  • Git History

  • gitignore

测试环境可用

在tests 目录中新建一个test.c的文件

#include <stdio.h>
typedef struct dictEntry 
    void *key;//8字节
    void *val;//8字节
    struct dictEntry *next; //8字节
 dictEntry;


typedef struct redisObject 
    unsigned type:4; //4位
    unsigned encoding:4; //4位
    // 24位
    unsigned lru:24; 
    int refcount; //4字节
    void *ptr; // 8字节
 robj;//一个robj 16直接

int main()

    dictEntry *entry;
    robj *robj;
    //获取entry的指针大小
    int length = sizeof(entry);
    printf("entry point size :%d \\n",length);
    //获取entry结构体大小
    length = sizeof(*entry);
    printf("entry size :%d \\n",length);
    length = sizeof(*robj);
    printf("robj size :%d \\n",length);
    return 0;



编译

cc test.c

执行

./a.out


可以把这块封装成脚本c.sh

#!/usr/bin/env bash
file=“test.c”
out=“a.out”
if [ $# -eq 1 ];then
file=$1
elif [ $# -eq 2 ];then
file=$1
out=$2
fi

echo “######编译 f i l e 为 file 为 fileout”
cc -o $out $file
echo "######执行 o u t " . / out" ./ out"./out


调用示例

sh c.sh test.c
sh c.sh test.c test


这么做的意图是随时可测试一些代码,看下占用空间,以及引用,对不熟悉的c的同学很有帮助

### git 操作

关联不同版本的分支

git branch -b 6.0 remotes/origin/6.0
git branch -b 5.0 remotes/origin/5.0
git branch -b 4.0 remotes/origin/4.0
git branch -b 3.2 remotes/origin/3.2
git branch -b 2.8 remotes/origin/2.8

暂存

git stash

恢复

git stash pop

提交备注

git add .
git commit -m ‘’
git push


### 目录结构

*   deps 主要是redis依赖的三方库
    

*   hiredis C语言版本的客户端
    
*   jemalloc 内存分配器(比glibc的效率高,碎片化少)
    
*   linenoise 行读写
    
*   lua lua脚本
    

*   src redis的源代码
    

*   modules 示例代码
    

*   tests 测试代码
    

*   unit 单元测试代码
    
*   cluster 集群功能测试代码
    
*   sentinel 哨兵功能测试代码
    
*   integration 主从复制功能测试代码
    
*   支撑测试的代码 assets、helpers、modules、support
    

*   utils redis工具包
    

*   create-cluster 创建集群工具
    
*   hashtable rehash过程
    
*   hyperloglog 误差率计算和展示(利用极小的空间统计,误差率是0.81%)
    
*   lru 
    
*   releasetools 发布工具包  
    

*   redis.conf 实例配置文件
    
*   sentinel.conf 哨兵配置文件
    

redis代码主要在src目录下其中 .h 为头文件,主要定义了数据结构和常量,.c 为源码文件。

#### 网络模块

*   ae.c ae.h 基于事件驱动的网络通信机制的封装
    
*   ae\\_\\*.c 事件驱动具体的实现方式
    
*   anet.c anet.h 底层tcp的网络通信封装(主要用于redis cluster通信)
    
*   networking.c 与客户端的交互
    

#### 内存管理

*   zmalloc.h(.c) redis内部对内存操作的封装,可以理解为抽象的接口,具体实现由
    
*   expire.c 设置过期key,以及过期key使用不同删除策略
    
*   lazyfree.c 异步删除功能
    
*   evict.c 各类淘汰算法
    

#### server服务实现相关

*   server.c server服务器的入口,可以了解redis的启动过
    
*   object.c  redisOject的封装  
    
*   db.c 对键值的crud操作
    
*   bio.c  后端操作线程  
    

#### 客户端相关

*   redis-cli.c
    

#### 高可用相关

*   aof.c aof日志的实现
    
*   rdb.h(rdb.c) 内存快照RDB的实现
    
*   redis-check-aof.c 恢复检查aof
    
*   redis-check-rdb.c 恢复检查rdb
    
*   replication.c 主从复制
    
*   sentinel.c 哨兵机制
    
*   cluster.h(.c) rediscluster功能实现
    

#### 数据结构和类型

*   adlist.c(.h) list类型定义与操作,底层是双向链表
    
*   bitops.c 位图定义与操作,底层是bitmap
    
*   dict.h(.c) hash类型定义与操作,底层是哈希表(数组)
    
*   geo.h(.c)/geohash\\_helper.h(.c)/geohash.h(.c) geol类型定义与操作,底层是geohash
    
*   hyperlolog.c
    
*   intset.h(.c) set类型定义与操作 整数列表
    
*   quicklist.h(.c) quicklist的定义与操作,底层是quicklist,用于list、hash、sorted set
    
*   sds.h(.c)/sdsalloc.h string类型定义与操作,底层是SDS
    
*   stream.h/t\\_stream.c stream类型的定义与操作,stream命令的封装(时序数据)
    
*   ziplist.h(.c) 压缩列表的底层封装
    
*   zipmap.h(.c) 压缩
    
*   t\\_hash.c hash的api以及hash命令的封装
    
*   t\\_list list的api以及list命令的封装
    
*   t\\_set.c set命令的封装
    
*   t\\_string.c string操作命令的封装
    
*   t\\_zset.c zset的api以及zset命令的封装
    

#### 运维辅助功能

*   latency.c(.h) 延迟统计
    
*   notify.c 事件通知
    
*   redis-benchmark.c 性能测试工具
    
*   slowlog.c 慢日志

以上是关于redis源码阅读-入门篇的主要内容,如果未能解决你的问题,请参考以下文章

Python代码阅读(第26篇):将列表映射成字典

Python代码阅读(第41篇):矩阵转置

Python代码阅读(第25篇):将多行字符串拆分成列表

Python代码阅读(第40篇):通过两个列表生成字典

Redis源码阅读,从入门到放弃

Python代码阅读(第13篇):检测列表中的元素是否都一样