首页 > 数据库 > 数据库开发技术 > 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 "######编译 $file 为$out"
cc -o $out $file
echo "######执行 $out"
./$out
调用示例
sh c.sh test.c
sh c.sh test.c test
这么做的意图是随时可测试一些代码,看下占用空间,以及引用,对不熟悉的c的同学很有帮助
# 关联不同版本的分支
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.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 慢日志
原文作者:5ycode;如有侵权,请联系管理员删除。