Redis源码阅读:为什么单线程性能这么好

202 阅读2分钟

一、背景知识

本文是从Java程序员的视角阅读的Redis代码,先交代一些看不懂影响阅读的语法。熟悉C语言的同学可以忽略了。

1、typedef

起别名,最简单的用法 typedef int soul,为 int 关键字起了一个soul别名。

高级的用法为函数类型起一个别名,其实在 JVM 层面也有函数类型,想想什么是函数类型,是不是入参+返回值的组合就是函数类型。

函数类型:表示“返回值,参数列表”相同的一个函数集合。

这里补充一点额外知识 ,void gatewag(int soul) 这里 gateway 既是函数名,也是函数指针(这段函数代码所在的地址)。

使用 typedef 自定义函数类型:

// 定义文件事件的回调函数类型
typedef void aeFileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask);

其实这就和 Java 的接口或者抽象类中的方法,具体实现要看继承类的实现方法。C语言也是具体实现要看函数类型定义的指针指向哪里。举个例子:

#include <stdio.h>

// 定义函数类型
typedef int gateway(char c);

int soul(char c) return 0;
int zuul(char c) return 1;

int main()
{
    int ret;
    gateway *gw; //gateway是函数类型

    gw = soul;
    ret = gw('a'); // ret = 0

    gw = zuul;
    ret = gw('b'); // ret = 1
    return 0;
}

二、为什么 Redis 是单线程的性能却很好

其实这里不严谨,Redis 并不是单线程的,有很多定时任务等辅助功能的实现是额外的线程在处理,这里的单线程主要指的是处理客户端请求读写数据的主线程是单线程。

  • 原因之一是处理高效的基于内存的数据结构外,想一下所有一个操作只要几微妙的话,那 OPS 得有多高,换句话就是如果每个请求的操作都是 1+1,还需要多线程吗

  • 另外一个原因是 Redis 自己封装的高性能的事件驱动网络库。A simple event-driven programming library ae.c 文件注释里写的,这也就是ae名字的来源把。

其实感觉接下来都不用写了,直接推荐两篇博客:

cloud.tencent.com/developer/a… 代码讲的好

draveness.me/redis-event… 图画的清晰

zhuanlan.zhihu.com/p/259768694 注释写的好

完美