ITPub博客

首页 > 数据库 > 数据库开发技术 > redis源码阅读-入门篇

redis源码阅读-入门篇

原创 数据库开发技术 作者:yxkong 时间:2021-12-08 09:03:03 0 删除 编辑

准备工作

  • 安装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 操作

# 关联不同版本的分支
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 慢日志


原文作者:5ycode;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-03-26

  • 博文量
    124
  • 访问量
    71509