【redis】单线程redis为什么这么快

专题2-单线程redis为什么这么快

2.1redis只有单线程吗?

为什么说redis是单线程?

redis的网络IO和键值对读写是由一个线程来完成的,这也是redis对外提供键值存储服务的主要流程。

2.2为什么redis使用单线程

多线程面临 多线程编程模式面临共享资源的并发访问控制问题。

多线程有一个关键的瓶颈,系统通常会存在被多线程同时访问的共享资源,比如一个共享的数据结构,当多个线程要修改这个共享资源的时候,为了保证共享资源的正确性,就需要额外的机制进行保证,这个额外的机制,就会带来额外的开销。

所以多线程会降低系统代码易调试性和可维护性。所以为了避免出现这种为问题,redis直接使用单线程模式。

2.3为什么redis单线程这么快?

两个方面原因:

  1. redis大部分操作在内存上完成,并且它有高效的数据结构。
  2. redis采用了多路复用机制,使其在网络IO操作中能处理大量的客户端请求,实现高吞吐率。

但是如果线程被阻塞,就无法进行多路复用了。

为什么线程会被阻塞?这需要了解基本IO模型与阻塞点

【redis】单线程redis为什么这么快_第1张图片

这里潜在的阻塞点:accept()和recv()

当 Redis监听到一个客户端有连接请求,但一直未能成功建立起连接时,会阻塞在 accept() 函数这

里,导致其他客户端无法和 Redis 建立连接。

类似的,当 Redis 通过 recv() 从一个客户端读取数据时,如果数据一直没有到达,Redis 也会一直阻塞在 recv()。

这样会导致线程阻塞,无法处理其他客户端请求,导致效率降低。

非阻塞模式

在 socket 模型中,不同操作调用后会返回不同的套接字类型。socket() 方法会返回主动套

接字,然后调用 listen() 方法,将主动套接字转化为监听套接字,此时,可以监听来自客户

端的连接请求。最后,调用 accept() 方法接收到达的客户端连接,并返回已连接套接字。

【redis】单线程redis为什么这么快_第2张图片

2.4基于多路复用的高性能I/O模型

Linux中的IO多路复用机制。该机制允许内核中,同时存在多个监听套接字。内核会一直监听这些套接字上的连接请求或数据请求。

redis可以同时和多个客户端连接并处理请求,从而提高并发性。

总结:多路复用的IO模型密切相关,因为避免了accept()和send()/recv()潜在的网络IO操作阻塞点。

你可能感兴趣的:(redis,redis,数据库,java)