场景应用:聊聊 Redis 单线程的相关问题

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了场景应用:聊聊 Redis 单线程的相关问题相关的知识,希望对你有一定的参考价值。

文章目录

Redis单线程相关问题

明明 Redis在持久化时fork出一个子进程,这时已经有两个进程了,怎么能说是单线程呢?

Redis是单线程的,主要是指Redis的网络IO和键值对读写是由一个线程来完成的

但是Redis的其他功能,如持久化、异步删除、集群数据同步等,则是依赖其他线程来执行的。所以,说Redis是单线程的只是一种习惯的说法,事实上它的底层不是单线程的

那么既然 Redis是单线程的,为什么还能这么快?

  1. 对服务端程序来说,线程切换和锁通常是性能杀手,而单线程避免了线程切换和竞争所产生的消耗;
  2. Redis的大部分操作是在内存上完成的,这是它实现高性能的一个重要原因;
  3. Redis采用了IO多路复用机制,使其在网络IO操作中能并发处理大量的客户端请求,实现高吞吐率。

关于Redis的单线程架构实现,如下图:

Redis为什么选用单线程?

为什么要使用单线程模型

1、单线程模型,可维护性更好,方便开发和调试。
2、单线程模型,能并发的处理客户端的请求。
3、Redis 服务中运行的绝大多数操作的性能瓶颈都不是 CPU,一般是网络带宽。

Redis单线程模型是如何处理多客户端请求的?

Redis单线程模型:针对每次请求调用,Redis都需经历接受命令、执行命令和返回结果三个过程。

其中,执行命令阶段,因Redis是单线程处理命令,于是每一条到达redis服务端的命令不会立刻执行,而是所有命令都进入一个队列中,然后逐个被执行。

多个请求端发送来的命令的执行顺序是不确定的,但可以确定的是不会有两条命令被同时执行,也就是不会产生并发问题,以上便是Redis的单线程基本模型。

Redis单线程模型执行流程如下:

1、Redis 将每个客户端都分别关联一个指令队列;客户端的指令通过队列来按顺序处理,先到先服务。

2、一个客户端的指令队列中的指令是顺序执行的;多个指令队列中的指令是无法保证顺序的。如上图中,执行完 client-0 的队列中的 command-0 后,然后执行哪个队列中的第一个指令是不确定的,但可以肯定的是不会有两个指令同时执行。

3、同样,Redis 会为每个客户端关联一个响应队列,通过响应队列来顺序地将指令的返回结果响应给客户端。

注意:

  1. 一个响应队列中的消息可以顺序的回复给客户端,多个响应队列之间是无法保证顺序的。
  2. 所有的客户端的队列中的指令或者响应,redis 每次都只能处理一个,同一时间绝对不会处理超过一个指令或者响应。

以上是关于场景应用:聊聊 Redis 单线程的相关问题的主要内容,如果未能解决你的问题,请参考以下文章

redis

Redis数据结构以及应用场景

聊聊Redis最适合的应用场景是什么

Redis为什么是单线程的

Redis

redis的应用场景简述