前言
我们都知道redis的访问响应非常快,常常用redis来做缓存、消息队列、发布订阅等,支撑系统实现高性能、高并发。但redis是如何具有这样的能力的呢?
一、redis的线程模型
redis是一个单线程的文件事件处理器,在redis的线程模型中,redis的文件事件处理器包含了五个部分的内容:多server socket、IO多路复用程序、socket事件队列、文件事件分派器、三种事件处理器(连接应答事件处理器、命令请求事件处理器、命令回复事件处理器),而redis之所以认为是单线程的,是因为文件事件分派器是单线程去消费socket事件队列的事件,整体模型如下图:
1、IO多路复用程序
redis的IO多路复用程序可通过select/epoll/evport/kqueue四种实现,程序在编译时根据性能较好的库自动选择其中的一个函数库。
IO多路复用程序通过监听socket,当有AE_READABLE和AE_WRITABLE的两种事件发生时把相应socket压入队列中
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