Redis系统支持适配
2021-02-22 本文已影响0人
Spicy_Chicken
原因1:
引用
Linux内核会给每个进程维护一个文件描述符表。而POSIX标准对于文件描述符进行了以下约束:
- fd为0、1、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封装而已。