0%

redis5.0服务端启动过程

Redis源码阅读参考(来源于网络)

1.基础数据结构

  • 内存分配 zmalloc.h、zmalloc.c
  • 简单动态字符串 sds.h、sds.c
  • 双端链表 adlist.h、adlist.c
  • 字典dict.h、dict.c
  • 跳跃表server.h、(zskiplist以及zskiplistNode结构)、t_zset.c
  • 整数集合intset.h、intset.c
  • 压缩列表ziplist.h、ziplist.c
  • 压缩字典 zipmap.h、zipmap.c
  • 快速链表 quicklist.h、quicklist.c
  • 基数统计 hyperloglog.c(hllhdr结构, hll 开头的函数)
  • geohash geohash.h、geohash.c

2.Redis数据类型

  • 对象系统 object.c
  • 字符串键 t_string.c
  • 列表建 t_list.c
  • 哈希键 t_hash.c
  • 集合键 t_set.c
  • 有序集合键 t_zset.c(除zsl开头的所有函数)
  • HyperLogLog键 hyperloglog.c(pf开头的函数)
  • 地理位置 geo.h、geo.c

3.Redis数据库

  • 数据库实现 db.c
  • 通知功能 notify.c
  • RDB持久化 rdb.h、rdb.c
  • AOF持久化 aof.c

4.客户端/服务端

  • 事件处理模块 ae.h、ae.c、ae_epoll.c、ae_evport.c、ae_kqueue.c、ae_select.c
  • 网路链接库 anet.h、anet.c、networking.c
  • 服务器端 server.h、server.c
  • 客户端 redis-cli.c

5.分布式Redis

  • 复制功能 replication.c
  • Redis哨兵 sentinel.c
  • Redis集群 cluster.h、cluster.c

6.独立功能模块

  • 发布和订阅 pubsub.c
  • 事务 multi.c

7.测试

  • 内存检测 memtest.c
  • redis性能测试 redis_benchmark.c
  • 更新日志检查 redis_check_aof.c
  • 本地数据库检查 redis_check_rdb.c
  • C风格的小型测试框架 testhelp.c

8.工具类

  • 二进制位操作命令 bitops.c
  • 调试 debug.c
  • 高低位转换 endianconv.h、endianconv.c(适配不同系统)
  • 辅助于命令的提示信息 help.h
  • 压缩算法 lzf.h、lzf_c.c、lzf_d.c、lzfP.h
  • 随机数 rand.h、rand.c
  • 版本发布 release.c
  • sha加密算法 sha1.h、sha1.c
  • 通用工具类 util.h、util.c
  • 循环冗余校验 crc16.c、crc64.h、crc64.c
  • SORT命令 sort.c
  • 伪随机函数 siphash.c
  • 进程信息操作 setproctitle.c
  • geo工具类 geohash_helper.h、geohash_helper.c

9.封装类

  • 后台线程I/O bio.h、bio.c
  • 延迟类 latency.h、latency.c
  • 排序算法类 pqsort.h、pqsort.c
  • Redis定义的I/O类 rio.h、rio.c
  • 同步Socket和文件I/O操作 syncio.c

10.其他

  • 微线图 sparkline.h、sparkline.c
  • 慢日志 slowlog.h、slowlog.c
  • 脚本 scripting.c
  • 过期机制 expire.c

官方站点

官方站点www.centos.org肯定是要知道的,所有第一手的release notes都是在这个网站的。

开源中国

很多时候,没有那么多精力关注官方站点,开源中国oschina.net是不二之选。他们的编辑(或者爬虫),会去各个技术网站拉取信息。

菜鸟入门必选runoob

很多国内的程序员在学习某们技术的时候,可能最先被引导去https://www.runoob.com/。
其实,入门之后,就是需要搭梯子,去看看英文站点了。

Jaeger项目背景和整体架构

项目背景

Jaeger项目是一套受到Dapper与OpenZipkin启发构建而成的分布式跟踪平台,由Uber公司最初以开源方式公布,随后加入了云原生计算基金会。该项目主要用于:监控并诊断基于微服务架构的分布式系统,具体涵盖:

  • 分布式上下文传播
  • 分布式事务监控
  • 根本原因分析
  • 服务依赖关系分析
  • 性能/延迟优化
阅读全文 »

先来看个代码

import (
"fmt"
"syscall"
)

func main(){
pid,_,_:=syscall.Syscall(39,0,0,0);
fmt.Println("pid is ",pid);
}

这里的39是什么意思呢,能取到当前程序的pid。

go对linux系统调用的封装都在/usr/local/go/src/syscall/zsysnum_linux_arm64.go文件中。
这个文件封装了313个系统调用,或者暴露了linux的313个系统调用的入口。

C语言库

C标准库

C标准库也叫ISO C库,定义了一组宏、类型和函数,用于输入/输出处理、字符串处理、内存管理、数学计算以及许多与操作系统服务相关的。它们在C标准(如C11标准)中做了规定。内容分布在各个头文件中,比如上面提到的math.h。

POXIS库

首先要理解什么是POSIX。
POSIX全称:可移植操作系统接口。故名思议,由于当时Unix诞生之后,由于各个厂商都实现自己的Unix(都敢使用Unix,由于版权的问题),接口的不统一,导致在各个厂商下基于不同的操作系统开发变得很乱,为了解决这一问题,便有了POSIX标准。

84个头文件

ISO C标准定义的头文件(24项)

<assert.h>       ----------------------   验证程序断言
<complex.h> ---------------------- 支持复数算术运算
<ctype.h> ---------------------- 字符类型
<errno.h> ---------------------- 出错码
<fenv.h> ---------------------- 浮点环境
<float.h> ---------------------- 浮点常量
<inttypes.h> ---------------------- 整型格式转换
<iso646.h> ---------------------- 替代关系操作符宏
<limits.h> ---------------------- 实现常量
<locale.h> ---------------------- 局部类别
<math.h> ---------------------- 数学常量
<setjmp.h> ---------------------- 非局部goto
<signal.h> ---------------------- 信号
<stdarg.h> ---------------------- 可变参数表
<stdbool.h> ---------------------- 布尔类型和值
<stddef.h> ---------------------- 标准定义
<stdint.h> ---------------------- 整型
<stdio.h> ---------------------- 标准I/O库
<stdlib.h> ---------------------- 实用程序库函数
<string.h> ---------------------- 字符串操作
<tgmath.h> ---------------------- 通用类型数学宏
<time.h> ---------------------- 时间和日期
<wchar.h> ---------------------- 扩展的多字节和宽字符支持
<wctype.h> ---------------------- 宽字符分类和映射支持

POSIX标准定义的必须的头文件(26项)

<dirent.h>      ----------------------   目录项
<fcntl.h> ---------------------- 文件控制
<fnmatch.h> ---------------------- 文件名匹配类型
<glob.h> ---------------------- 路径名模式匹配类型
<grp.h> ---------------------- 组文件
<netdb.h> ---------------------- 网络数据库操作
<pwd.h> ---------------------- 口令文件
<regex.h> ---------------------- 正则表达式
<tar.h> ---------------------- tar归档值
<termios.h> ---------------------- 终端I/O
<unistd.h> ---------------------- 符号常量
<utime.h> ---------------------- 文件时间
<wordexp.h> ---------------------- 字扩展类型
<arpa/inet.h> ---------------------- Internet定义
<net/if..h> ---------------------- 套接字本地接口
<netinet/in.h> ---------------------- Internet地址族
<netinet/tcp.h>---------------------- 传输控制协议定义
<sys/mman.h>---------------------- 内存管理声明
<sys/select.h>---------------------- select函数
<sys/socket.h>---------------------- 套接字接口
<sys/stat.h> ---------------------- 文件状态
<sys/times.h> ---------------------- 进程时间
<sys/types.h> ---------------------- 基本系统数据类型
<sys/un.h> ---------------------- UNIX域套接字定义
<sys/utsname.h>----------------------系统名
<sys/wait.h> ---------------------- 进程控制

POSIX标准定义的XSI扩展头文件(26项)

列表如下:

<cpio.h>          ----------------------   cpio归档值
<dlfcn.h> ---------------------- 动态链接
<fmtmsg.h> ---------------------- 消息显示结构
<ftw.h> ---------------------- 文件树漫游
<iconv.h> ---------------------- 代码集转换实用程序
<langinfo.h> ---------------------- 语言信息常量
<libgen.h> ---------------------- 模式匹配函数定义
<monetary.h> ---------------------- 货币类型
<ndbm.h> ---------------------- 数据库操作
<nl_types.h> ---------------------- 消息类别
<poll.h> ---------------------- 轮询函数
<search.h> ---------------------- 搜索表
<strings.h> ---------------------- 字符串操作
<syslog.h> ---------------------- 系统出错日志记录
<ucontext.h> ---------------------- 用户上下文
<ulimit.h> ---------------------- 用户限制
<utmpx.h> ---------------------- 用户帐户数据库
<sys/ipc.h> ---------------------- IPC
<sys/msg.h> ---------------------- 消息队列
<sys/resource.h>------------------- 资源操作
<sys/sem.h> ---------------------- 信号量
<sys/shm.h> ---------------------- 共享存储
<sys/statvfs.h>---------------------- 文件系统信息
<sys/time.h> ---------------------- 时间类型
<sys/timeb.h> ---------------------- 附加的日期和时间定义
<sys/uio.h> ---------------------- 矢量I/O操作

POSIX标准定义的可选头文件(8项)

<aio.h>            ----------------------   异步I/O
<mqueue.h> ---------------------- 消息队列
<pthread.h> ---------------------- 线程
<sched.h> ---------------------- 执行调度
<semaphore.h>--------------------- 信号量
<spawn.h> ---------------------- 实时spawn接口
<stropts.h> ---------------------- XSI STREAMS接口
<trace.h> ---------------------- 时间跟踪

实现C库

从这部分开始讨论真实的代码。实现标准库的开发者先阅读官方ISO文档需求,然后把它们转成代码。实现时必须依赖特定操作系统提供的功能(读/写文件,分配内存,创建线程等等,通过所谓的系统调用),因此每个平台都要有自己的一套标准库实现。有时它是系统的一个核心部分,有时由另外的组件(编译器)提供,这个必须另外下载。

GNU/Linux的实现

GNU C库即glibc,是GNU项目对C标准库的实现。并不是所有的标准C函数都能在glibc中找到:大部分数学函数其实由libm实现,它是另外的一个库。
目前glibc是Linux上使用最广泛的C库。不过在90年代有个glibc的竞争者叫Linux libc(或者就叫libc),它fork自glibc 1.x。有段时间内,Linux libc是许多Linux发行版的标准C库。
经过多年的开发,glibc被证明远远优于Linux libc,曾经使用libc的Linux发行版都转成使用glibc了。所以要是你的磁盘上有个文件叫libc.so.6请不要惊慌,它是个现代的glibc。版本号涨到6是为了避免与之前Linux libc的版本混淆(不能把它命名成glibc.so.6,因为所有的Linux库命名都必须以lib开头)。
再来看看C++库,实现于libstdc++,或者叫GNU标准C++库。它是个一直持续着的项目,在GNU/Linux上实现了标准C++库。一般常见的Linux发行版默认使用libstdc++。

Mac和iOS的实现

在Mac和iOS上,C标准库的实现是核心库libSystem的一部分,位于/usr/lib/libSystem.dylib。LibSystem还包括了数学库、线程库及其他底层组件。
至于C++标准库,Mac在OS X Mavericks(10.9 版本)前默认使用libstdc++,与现代Linux系操作系统使用相同的。自OS X Mavericks之后,苹果转而使用libc++,它由Mac官方编译器框架LLVM项目实现,用以替代GNU libstdc++标准库。
iOS开发者通过iOS SDK(Software Development Kit)使用标准库。iOS SDK是一组用于创建移动App的工具集。

Windows的实现

Windows上标准库的实现与微软官方编译器Visual Studio严格绑在一起,称为C/C++运行时库(CRT),它包括了标准库的实现。
最初将CRT实现为CRTDLL.DLL库。从Windows 95开始,微软把它实现在MSVCR[版本号].DLL(MSVCR20.DLL, MSVCR70.DLL等)中,猜测也包含了C++标准库。
1997年左右,他们决定把文件名简化为MSVCRT.DLL,这不幸导致了臭名昭著的DLL mess。这也就是为什么从Visual Studio 7.0后又转回每个版本搭载DLLs。
Visual Studio 2015对CRT做了大规模重构,C/C++标准库实现在一个新的库,名为统一C运行时库(Universal CRT or UCRT),编译成UCRTBASE.DLL。
UCRT目前已成为Windows的组件,从Windows 10开始作为操作系统的一部分。

本文参考资料

http://www.cnitblog.com/guopingleee/archive/2007/08/13/31701.html