场景应用:Redis 单线程模型
文章目录
Redis单线程相关问题
明明 Redis在持久化时fork出一个子进程,这时已经有两个进程了,怎么能说是单线程呢?
Redis是单线程的,主要是指Redis的网络IO和键值对读写是由一个线程来完成的。
但是Redis的其他功能,如持久化、异步删除、集群数据同步等,则是依赖其他线程来执行的。所以,说Redis是单线程的只是一种习惯的说法,事实上它的底层不是单线程的。
那么既然 Redis是单线程的,为什么还能这么快?
- 对服务端程序来说,线程切换和锁通常是性能杀手,而单线程避免了线程切换和竞争所产生的消耗;
- Redis的大部分操作是在内存上完成的,这是它实现高性能的一个重要原因;
- Redis采用了IO多路复用机制,使其在网络IO操作中能并发处理大量的客户端请求,实现高吞吐率。
关于Redis的单线程架构实现,如下图:
Redis为什么选用单线程?
为什么要使用单线程模型
1、单线程模型,可维护性更好,方便开发和调试。
2、单线程模型,能并发的处理客户端的请求。
3、Redis 服务中运行的绝大多数操作的性能瓶颈都不是 CPU,一般是网络带宽。
Redis单线程模型
Redis单线程模型是如何处理多客户端请求的?
Redis单线程模型:针对每次请求调用,Redis都需经历接受命令、执行命令和返回结果三个过程。
其中,执行命令阶段,因Redis是单线程处理命令,于是每一条到达redis服务端的命令不会立刻执行,而是所有命令都进入一个队列中,然后逐个被执行。
多个请求端发送来的命令的执行顺序是不确定的,但可以确定的是不会有两条命令被同时执行,也就是不会产生并发问题,以上便是Redis的单线程基本模型。
Redis单线程模型执行流程如下:
1、Redis 将每个客户端都分别关联一个指令队列;客户端的指令通过队列来按顺序处理,先到先服务。
2、一个客户端的指令队列中的指令是顺序执行的;多个指令队列中的指令是无法保证顺序的。如上图中,执行完 client-0 的队列中的 command-0 后,然后执行哪个队列中的第一个指令是不确定的,但可以肯定的是不会有两个指令同时执行。
3、同样,Redis 会为每个客户端关联一个响应队列,通过响应队列来顺序地将指令的返回结果响应给客户端。
注意:
- 一个响应队列中的消息可以顺序的回复给客户端,多个响应队列之间是无法保证顺序的。
- 所有的客户端的队列中的指令或者响应,redis 每次都只能处理一个,同一时间绝对不会处理超过一个指令或者响应。