Redis系统支持适配

2021-02-22  本文已影响0人  Spicy_Chicken

原因1:

引用
Linux内核会给每个进程维护一个文件描述符表。而POSIX标准对于文件描述符进行了以下约束:

  1. fd为0、1、2分别表示标准输入、标准输出和错误输出
  2. 每次新打开的fd,必须使用当前进程中最小可用的文件描述符。
    Redis充分利用了文件描述符的这些特点,来存储每个fd对应的事件。

原因2:

因为redis 是单线程高性能的。
所以redis需要单线程轮询。
操作系统机制的轮询是不太一样的。
简而言之 linxu轮询用epoll,window 用selector
但是性能上来说 epoll是高于selector 的。

原因3

redis-windows是由微软开发的。
Redis不仅支持Linux下的epoll,还支持其他的IO复用方式,目前支持如下四种: 1. epoll:支持Linux系统 2. kqueue:支持FreeBSD系统(如macOS) 3. select 4. evport: 支持Solaris

几个IO复用方式使用的判断顺序如下:

#ifdef HAVE_EVPORT
#include "ae_evport.c"
#else
    #ifdef HAVE_EPOLL
    #include "ae_epoll.c"
    #else
        #ifdef HAVE_KQUEUE
        #include "ae_kqueue.c"
        #else
        #include "ae_select.c"
        #endif
    #endif
#endif

这个顺序其实也代表了四种IO复用方式的性能高低。

对于每种IO复用方式,只要实现以下8个接口就可以正常对接Redis了:

int aeApiCreate(aeEventLoop *eventLoop);
void aeApiDelEvent(aeEventLoop *eventLoop, int fd, int delmask);
void aeApiResize(aeEventLoop *eventLoop, int setsize);
void aeApiFree(aeEventLoop *eventLoop);
int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask);
void aeApiDelEvent(aeEventLoop *eventLoop, int fd, int delmask);
int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp);
char *aeApiName(void);

在这个8个接口下面,其实底层并没有做太多的优化,只是简单的对原有API封装而已。

上一篇下一篇

猜你喜欢

热点阅读