美文网首页Redis
二、Redis单线程为什么还那么快?

二、Redis单线程为什么还那么快?

作者: 龚志丹 | 来源:发表于2020-10-30 17:17 被阅读0次

为什么说Redis单线程?

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

Redis什么情况下是多线程?

持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。所以,严格意义来讲Redis不是单线程。

Redis为什么用单线程?

多线程编程模式面临的共享资源的并发访问控制问题。为了保证共享资源的正确性,就需要有额外的机制进行保证,而这个额外的机制,就会带来额外的开销,即使增加了线程,大部分线程也在等待获取访问共享资源的互斥锁,并行变串行。为避免这些性能消耗设计方案所以Redis采用了单线程。

Redis单线程为什么那么快?

Redis官方显示它可以达到每秒数十万级别的处理能力,这是因为Redis多方面设计的综合结果。

  • Redis采用纯内存操作,其次它采用了高效的数据结构。如:哈希表和跳表。
  • 采用I/O多路复用
  • 避免多线程编程模式面临的共享资源的并发访问控制问题。多线程和多进程切换消耗CPU,并且需要加锁、释放锁等操作,也不会出现死锁等问题。

基本 IO 模型与阻塞点?

基本IO模型

阻塞点分别是accept() 和 recv(),当 Redis 监听到一个客户端有连接请求,但一直未能成功建立起连接时,会阻塞在 accept() 函数这里,导致其他客户端无法和 Redis 建立连接。类似的,当 Redis 通过 recv() 从一个客户端读取数据时,如果数据一直没有到达,Redis 也会一直阻塞在 recv()。但是,socket 网络模型本身支持非阻塞模式。

非阻塞模式

socket执行流程:socket() 方法会返回主动套接字,然后调用 listen() ,主动套接字转为监听套接字,这样就可以监听来自客户端的连接请求。最后,调用 accept() 方法接收到达的客户端连接,并返回已连接套接字。
伪代码释义:

listen_fd = socket(TCP);
bind(listen_fd, my_addr); 
listen(listen_fd, backlog); 
while(true) {
  client_fd = accept(listen_fd); // 阻塞
  read(client_fd, request);  //  阻塞
}
Redis套接字类型与非阻塞设置

针对监听套接字,设置非阻塞模式:需要有机制(I/O多路复用)继续监听该已连接套接字,并在有数据达到时通知 Redis。

多路复用I/O 模型

Linux 中的 IO 多路复用机制是指一个线程处理多个 IO 流,就是select/epoll 机制,它们可以实现同时存在多个监听套接字和已连接套接字。为了在请求到达时能通知到 Redis 线程,select/epoll 提供了基于事件的回调机制,即针对不同事件的发生,调用相应的处理函数。如图:

基于多路复用的Redis高性能IO模型

回调机制:select/epoll 一旦监测到 FD 上有请求到达时,就会触发相应的事件。
所以,Redis 单线程对只对该事件队列不断进行处理,调用处理函数。

以连接请求和读数据请求为例:
这两个请求分别对应 Accept 事件和 Read 事件,Redis 分别对这两个事件注册 accept 和 get 回调函数。当 Linux 内核监听到有连接请求或读数据请求时,就会触发 Accept 事件和 Read 事件,此时,内核就会回调 Redis 相应的 accept 和 get 函数进行处理。

相关文章

  • Redis为什么那么快

    为什么redis那么快?单线程的redis为什么那么快?在学习使用redis时,都会有这样的疑虑。大家说的redi...

  • 二、Redis单线程为什么还那么快?

    为什么说Redis单线程? Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提...

  • 3:高性能IO模型:为什么单线程Redis能那么快?

    1:Redis单线程的概念? 2:Redis使用单线程和多线程对比? 3:Redis使用单线程为什么这么快? 4:...

  • Redis单线程为什么快?

    Redis使用了单线程和I/O多路复用模型来实现高性能的内存数据库服务器。 1 Redis单线程为什么那么快? (...

  • 决战紫禁之巅之Redis面试

    Redis单线程为什么那么快? redis的速度非常快,速度快的原因主要有以下几点: 完全基于内存操作 C语言实现...

  • redis事件处理器

    redis是单线程的,为什么又那么快。。研究了下事件处理的源码,画出了下图:

  • 2020-08-12:Redis单线程为什么这么快?

    前言 每日一题专栏 为什么单线程的Redis这么快 一、 redis采用了纯内存的操作进行处理数据二、 redis...

  • Java-分布式框架-redis-1

    Redis核心原理 Redis的单线程和高性能 Redis 单线程为什么还能这么快? 因为它所有的数据都在内存中,...

  • redis-io-nio

    redis-io模型 单线程的程序有哪些? nginx node.js redis 单线程为什么快 全是内存运...

  • Redis

    Redis 单线程为什么还这么快? 命令执行基于内存操作。 单线程操作,没有线程切换的开销。 基于IO多路复用机制...

网友评论

    本文标题:二、Redis单线程为什么还那么快?

    本文链接:https://www.haomeiwen.com/subject/lhpdvktx.html