- 首页
- 助理医师
答案:
- 第一点就是redis在内存上执行操作,然后加上高效的数据结构,例如哈希表和跳表等,可以实现高性能。
- 另一方面,单线程的 Redis 也能获得高性能,跟多路复用的 IO 模型密切相关。
- 最原始的时候是使用的等待队列类似于先来先服务的做法(BIO),但是如果有一个客户端阻塞的话会造成后续客户端服务的阻塞;这时候解决方案之一就是使用多线程,但是就会造成额外的开销;
- 因此使用多路复用模型(NIO),select、poll、epoll都是NIO模型。不过select和poll都是基于轮询机制实现的,有些socket只是建立了连接,没有发送数据,就会造成空轮询,在高并发场景下效率不够高,select支持的最大连接数为1024,poll的则是无上限;而epoll模型,在linux内核中实现了一个红黑树用于注册每个fd,即每个socket,用一个双向链表用于记录每个已就绪的fd。epoll模型采用了事件监听机制,有三种事件,分别是服务端读、客户端读、客户端写。服务端读就是客户端建立新的连接,服务端要读一下socket的fd并注册到epoll的红黑树上;客户端读是说读取c端的redis命令;客户端写是说向c端写回指令执行结果。当监听到有就绪的fd的时候就会判断事件类型,进而执行相应处理函数。linux的epoll模型核心函数有三个,分别是epoll_create,用于初始化epoll,建立红黑树和双向链表就绪队列等;epoll_ctl,用于注册一个fd;epoll_wait,用于循环等待就绪的fd
- epoll流程图

-