前言

  我们都知道redis的访问响应非常快,常常用redis来做缓存、消息队列、发布订阅等,支撑系统实现高性能、高并发。但redis是如何具有这样的能力的呢?

一、redis的线程模型

  redis是一个单线程的文件事件处理器,在redis的线程模型中,redis的文件事件处理器包含了五个部分的内容:多server socket、IO多路复用程序、socket事件队列、文件事件分派器、三种事件处理器(连接应答事件处理器、命令请求事件处理器、命令回复事件处理器),而redis之所以认为是单线程的,是因为文件事件分派器是单线程去消费socket事件队列的事件,整体模型如下图:
redis线程模型以及如何确保高性能  1、IO多路复用程序
    redis的IO多路复用程序可通过select/epoll/evport/kqueue四种实现,程序在编译时根据性能较好的库自动选择其中的一个函数库。
    IO多路复用程序通过监听socket,当有AE_READABLE和AE_WRITABLE的两种事件发生时把相应socket压入队列中
redis线程模型以及如何确保高性能  2、事件处理器
    (1)连接应答处理器:redis在启动初始化时会将连接应答处理器与server socket的AE_READABLE事件关联起来,当有socket产生连接请求时会产生AE_READABLE连接事件,由文件事件分派器交由连接应答处理器处理。连接成功后,redis会将AE_READABLE事件与命令请求处理器关联起来
    (2)命令请求处理器:当客服端发生请求时,会产生AE_READABLE事件,由命令请求处理器执行socket消息读取操作
    (3)命令回复处理器:当服务器有消息要返回给客户端时,redis会将AE_WRITABLE事件与命令回复处理器关联起来,当客服端准备好接收,产生AE_WRITABLE事件时,由命令回复处理器执行socket写入操作返回数据

二、如何确保高性能

  1、redis读写都是操作内存:纯内存读写
  2、由redis线程模型可知,redis采用非阻塞方式的IO多路复用程序实现客户端与服务端的交互
  3、单线程的文件事件分派器,避免了频繁的上下文切换带来的性能问题
  4、redis支持通过管道的方式一次性批量执行多个命令和返回结果

参考文章:
  https://blog.csdn.net/y277an/article/details/98342442
  https://www.cnblogs.com/xiaowei123/p/13118176.html

相关文章: