发表评论

后才能评论

评论(2)

  • 草下有重名 训练营会员 2023-04-07 7:23 下午

    为什么Redis单线程且并发响应效率这么快?

    Redis线程模型是通过非阻塞I/O多路复用模型轮询监听多个socket请求,并把请求压入队列,然后交由文件事件分派器分派给相应的文件事件处理器进行处理,整个过程只在调用select、poll、epoll这些函数的时候才会阻塞,收发客户消息是不会阻塞的,可以充分利用整个线程;

    其中Redis命令是交给命令请求处理器然后在内存中操作的,而内存操作非常快;

    同时由于文件事件分派器是单线程的,所以整个Redis也是单线程的,这样就避免了多线程频繁上下文切换问题

    总结:
    – 非阻塞I/O多路复用模型
    – 纯内存操作
    – 单线程模式,避免了不必要的上下文切换及竞争条件

  • 草下有重名 训练营会员 2023-04-07 6:57 下午

    Redis与客户端通信的流程三部曲:
    首先server要初始化,在server_socket上注册AE_READABLE事件,并与连接应答处理器关联。
    1.客户端请求与服务端建立连接,server会收到AE_READABLE事件
    – 通过文件事件分派器,找到连接应答处理器
    – 在客户端的socket上注册AE_READABLE事件,并将事件关联命令请求处理器
    2.客户端发起命令请求,如set a 1,server会收到AE_READABLE事件
    – 通过文件事件分派器,找到命令请求处理器(此时这个socket上的这个事件已经关联到命令请求处理器而不是连接应答处理器)
    – 在内存中执行命令
    – 在客户端的socket上注册AE_WRITEABLE事件,并将事件关联请求回复处理器
    3.客户端告诉server自己准备好接受响应数据了,server会收到AE_WRITABLE事件:
    – 通过文件事件分派器,找到命令回复处理器
    – 将数据写入socket
    – 将AE_WRITABLE事件与命令回复处理器解绑

    流程中三部曲找到相应的文件事件处理器都要用到文件事件分派器,因为文件事件分派器是单线程的,所以Redis是单线程的