美文网首页
Redis系统支持适配

Redis系统支持适配

作者: Spicy_Chicken | 来源:发表于2021-02-22 23:24 被阅读0次

    原因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封装而已。

    相关文章

      网友评论

          本文标题:Redis系统支持适配

          本文链接:https://www.haomeiwen.com/subject/jhlvwktx.html