首页 > 试题广场 >

说一说Redis的单线程模型

[问答题]
推荐

得分点

​ IO多路复用

参考答案

标准回答

​ Redis的网络IO和键值对读写是由一个线程来完成的,但Redis的其他功能,例如持久化、异步删除、集群数据同步等操作依赖于其他线程来执行。单线程可以简化数据结构和算法的实现,并且可以避免线程切换和竞争造成的消耗。但要注意如果某个命令执行时间过长,会造成其他命令的阻塞。Redis采用了IO多路复用机制,这带给了Redis并发处理大量客户端请求的能力。

加分回答

Redis单线程实现为什么这么快

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

延伸阅读

Redis线程模型:


图片说明

编辑于 2021-09-15 10:50:35 回复(0)
从redis的性能上进行考虑,单线程避免了上下文频繁切换问题,效率高; 从redis的内部结构设计原理进行考虑,redis是基于Reactor模式开发了自己的网络事件处理器: 这个处理器被称为文件事件处理器(file event handler)。而这个文件事件处理器是单线程的,所以才叫redis的单线程模型,这也决定了redis是单线程的。
发表于 2022-03-23 23:13:31 回复(0)
Redis基于Reactor模式开发了网络事件处理器,这个处理器就叫做文件事件处理器(file event handler).这个文件事件处理器是单线程的,所以Redis才叫做单线程的模型,文件事件处理器采用了IO多路复用机制同时监听多个socket,根据socket上的事件来选择对应的事件处理器来处理这个事件

发表于 2021-10-21 00:15:04 回复(0)
Redis基于Rector模式开发了网络事件处理器,这个处理器叫做文件事件处理器,这个文件事件处理器是单线程的,所以Redis才叫做单线程的模型.它采用I/O多路复用机制来同时监听多个Socket,根据Socket上的事件类型来选择对应的处理器来处理这个事件,可以实现共性能的网络通信模型,又可以跟内部其他单线程模块进行对接,保证了Redis内部线程模型的简单性
单线程快的原因:
  1.纯内存操作
 2.核心是基于非阻塞的I/o多路服用机制
3.单线程反而避免了多线程频繁上下文切换带来的性能问题
发表于 2022-05-23 09:44:06 回复(0)
1,使用Redis时,几乎不存在CPU成为瓶颈的情况, Redis主要受限于内存和网络。
2,使用了单线程后,可维护性高,多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。Redis通过AE事件模型以及IO多路复用等技术,处理性能非常高,因此没有必要使用多线程。单线程机制使得 Redis 内部实现的复杂度大大降低,Hash 的惰性 Rehash、Lpush 等等 “线程不安全” 的命令都可以无锁进行。
4.基于内存,单线程就已经满足

发表于 2024-10-10 17:53:03 回复(0)
从redis的性能上进行考虑,单线程避免了上下文频繁切换问题,效率高; 从redis的内部结构设计原理进行考虑,redis是基于Reactor模式开发了自己的网络事件处理器: 这个处理器被称为文件事件处理器(file event handler)。而这个文件事件处理器是单线程的,所以才叫redis的单线程模型,这也决定了redis是单线程的
发表于 2022-11-23 15:09:03 回复(0)

Redis客户端到服务器三过程:发送命令、执行命令、结果返回

执行命令阶段是单线程的,而且命令到达服务器时不会立即执行,而是所有命令进入一个队列,然后逐个被执行。并且多个客户的发送的命令的执行顺序是不确定的,但是可以确定的是不会有两个命令同时被执行,不会产生并发问题。

Redis面向高速执行的数据库,因为Redis是单线程模式,如果每条命令执行需要花费的时间很长,会造成线程阻塞。

Redis内部实现:epoll+自己实现的简单的事件框架,epoll中的读、写、关闭、连接都转化为了事件,然后利用epoll的多路复用特性,不在io上了浪费时间。

一次完整的Redis请求:客户端到服务器的网络连接--Redis读写事件发生--Redis服务器数据处理(单线程)--数据返回

分阶段:

1.客户端到服务器的连接(tcp三次握手)

socket通信,socket服务端监听(listen)多个客户端请求,客户端(a.socket()创建socket对象,b.connect)连接服务器

2.Redis读写事件发生并向服务端发送请求数据

基于tcp连接发起读写事件,假设是set写数据,Redis客户端向建立连接的网络流中发送数据。服务端可以理解为为每一个网络连接创建一个线程同时接收客户端的请求数据。

3.Redis服务端的数据处理

完成数据接收后,依照接收的数据做逻辑处理,然后得到处理后的数据,数据处理可以理解为方法调用,带参调用方法,得到返回值。

4.数据返回

Redis处理完数据之后,立即返回1处理后的数据。

多路复用理解

多路:多个网络连接 复用:复用同一个线程

发表于 2022-09-25 16:45:07 回复(0)