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 为
file为out”
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源码阅读-入门篇的主要内容,如果未能解决你的问题,请参考以下文章