Redis是单线程,主要是指Redis的⽹络IO和键值对读写是由⼀个线程来完成的,这也是Redis对外提供键值存储服务的主要流程。但Redis的其他功能,⽐如持久化、异步删除、集群数据同步等,其实是由额外的线程执⾏的。
1.为什么使用单线程?
1.1 多线程开销
 
系统中通常会存在被多线程同时访问的共享资源,⽐如⼀个共享的数据结构。当有多个线程要修改这个共享资源时,为了保证共享资源的正确性,就需要有额外的机制进⾏保证,⽽这个额外的机制,就会带来额外的开销。
Redis有List的数据类型,并提供出队(LPOP)和⼊队(LPUSH)操作。假设Redis采⽤多线程设计,为了保证队列⻓度的正确性,Redis需要让线程A和B的LPUSH和LPOP串⾏执⾏,这样⼀来,Redis可以⽆误地记录它们对List⻓度的修改。否则,我们可能就会得到错误的⻓度结果。这就是多线程编程模式⾯临的共享资源的并发访问控制问题。
并发访问控制⼀直是多线程开发中的⼀个难点问题,如果没有精细的设计,⽐如说,只是简单地采⽤⼀个粗粒度互斥锁,就会出现不理想的结果:即使增加了线程,⼤部分线程也在等待获取访问共享资源的互斥锁,并⾏变串⾏,系统吞吐率并没有随着线程的增加⽽增加。
 
1.2 单线程为什么快?
  • Redis的⼤部分操作在内存上完成,再加上它采⽤了⾼效的数据结构,例如哈希表和跳表,这是它实现⾼性能的⼀个重要原因。
  • Redis采⽤了多路复⽤机制,使其在⽹络IO操作中能并发处理⼤量的客⼾端请求,实现⾼吞吐率。
 
1.2.1 多路复用机制
Linux中的IO多路复⽤机制是指⼀个线程处理多个IO流,就是我们经常听到的select/epoll机制。简单来说,在Redis只运⾏单线程的情况下,该机制允许内核中,同时存在多个监听套接字和已连接套接字。内核会⼀直监听这些套接字上的连接请求或数据请求。⼀旦有请求到达,就会交给Redis线程处理,这就实现了⼀个Redis线程处理多个IO流的效果。
下图就是基于多路复⽤的Redis IO模型。图中的多个FD就是刚才所说的多个套接字。Redis⽹络框架调⽤epoll机制,让内核监听这些套接字。此时,Redis线程不会阻塞在某⼀个特定的监听或已连接套接字上,既,不会阻塞在某⼀个特定的客⼾端请求处理上。正因为此,Redis可以同时和多个客⼾端连接并处理请求,从⽽提升并发性。
 

  • select/epoll⼀旦监测到FD上有请求到达时,就会触发相应的事件。
  • 事件会被放进⼀个事件队列,Redis单线程对该事件队列不断进⾏处理。
  • 同时,Redis在对事件队列中的事件进⾏处理时,会调⽤相应的处理函数,这就实现了基于事件的回调。因为Redis⼀直在对事件队列进⾏处理,所以能及时响应客⼾端请求,提升Redis的响应性能。
 
 
Redis单线程处理IO请求性能瓶颈:
 
1、任意⼀个请求在server中⼀旦发⽣耗时,都会影响整个server的性能
1.1:操作bigkey:写⼊⼀个bigkey在分配内存时需要消耗更多的时间,同样,删除bigkey释放内存同样会产⽣耗时;
1.2:使⽤复杂度过⾼的命令:例如SORT/SUNION/ZUNIONSTORE,或者O(N)命令,但是N很⼤,例如lrange key 0 -1⼀次查询全量数据;
1.3:⼤量key集中过期:Redis的过期机制也是在主线程中执⾏的,⼤量key集中过期会导致处理⼀个请求时,耗时都在删除过期key,耗时变⻓;
1.4:⼤量key集中过期:Redis的过期机制也是在主线程中执⾏的,⼤量key集中过期会导致处理⼀个请求时,耗时都在删除过期key,耗时变⻓;
1.5:AOF刷盘开启always机制:每次写⼊都需要把这个操作刷到磁盘,写磁盘的速度远⽐写内存慢,会拖慢Redis的性能;
1.6:主从全量同步⽣成RDB:虽然采⽤fork⼦进程⽣成数据快照,但fork这⼀瞬间也是会阻塞整个线程的,实例越⼤,阻塞时间越久;
2、并发量⾮常⼤时,单线程读写客⼾端IO数据存在性能瓶颈,虽然采⽤IO多路复⽤机制,但是读写客⼾端数据依旧是同步IO,只能单线程依次读取客⼾端的数据,⽆法利⽤到CPU多核。
 

⾼性能IO模型:为什么单线程Redis能那么快的更多相关文章

  1. 单线程 Redis 为什么这么快,看看这篇就知道了

    Redis 作为一种 KV 缓存服务器,有着极高的性能,相对于 Memcache,Redis 支持更多种数据类型,因此在业界应用广泛. 记得刚毕业那会参加面试,面试官会问我 Redis 为什么快,由于 ...

  2. 03 高性能IO模型:采用多路复用机制的“单线程”Redis

    本篇重点 三个问题: "Redis真的只有单线程吗?""为什么用单线程?""单线程为什么这么快?" "Redis真的只有单线程吗? ...

  3. Redis基础篇(二)高性能IO模型

    我们经常听到说Redis是单线程的,也会有疑问:为什么单线程的Redis能那么快? 这里要明白一点:Redis是单线程,主要是指Redis的网络IO和键值对读写是由一个线程来完成的,这也是Redis对 ...

  4. 详解redis网络IO模型

    前言 "redis是单线程的" 这句话我们耳熟能详.但它有一定的前提,redis整个服务不可能只用到一个线程完成所有工作,它还有持久化.key过期删除.集群管理等其它模块,redi ...

  5. Linux五种IO模型性能分析

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步:       所谓同步,就是在发出一个功能调用时, ...

  6. Windows五种IO模型性能分析和Linux五种IO模型性能分析

    Windows五种IO模型性能分析和Linux五种IO模型性能分析 http://blog.csdn.net/jay900323/article/details/18141217 http://blo ...

  7. Redis为什么使用单进程单线程方式也这么快

    [转] http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.htm ...

  8. Redis 为什么使用单进程单线程方式也这么快(转载)

    Redis 采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由 C 语言编写.官方提供的数据是可以达到100000+的 qps.这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 ...

  9. 网络编程并发 多进程 进程池,互斥锁,信号量,IO模型

    进程:程序正在执行的过程,就是一个正在执行的任务,而负责执行任务的就是cpu 操作系统:操作系统就是一个协调.管理和控制计算机硬件资源和软件资源的控制程序. 操作系统的作用: 1:隐藏丑陋复杂的硬件接 ...

  10. 为什么说Redis是单线程的以及Redis为什么这么快!

    参考文章:https://blog.csdn.net/xlgen157387/article/details/79470556 redis简介 Redis是一个开源的内存中的数据结构存储系统,它可以用 ...

随机推荐

  1. pytorch学习笔记(5)--神经网络

    (一)神经网络的骨架 nn.Module import torch from torch import nn class Tudui(nn.Module): def __init__(self): s ...

  2. PostScript语言教程(五、文本打印)

    5.1.POSTSCRIPT字体 字体是具有统一规格的字符集.其中包含数百个字符集,包含熟悉的TIMES和HELVETICA 使用POSTSCRIPT字体 在你打印文本之前,你需要指定所需的字体,这个 ...

  3. 【2020NOI.AC省选模拟#6】A. zyb的监控计划

    题目链接 原题解: 考虑我们需要的信息:子树里最浅的一个能向上的点是谁?子树里最深的一个没被覆盖的深度是多少? 我们记录一下$f_{i,a,b}$表示上面两个信息为$a$和$b$的时候,最少要花费的代 ...

  4. <四>JMeter数据库连接/后置处理器/断言简介

    一.数据库连接 1.右键线程组添加--配置元件--JDB Cconnection Configuration 2.配置如下: URL为数据路连接地址,用户名密码为数据库用户名和密码 3.添加一个JDB ...

  5. node16 以上版本不能安装 node-sass

    最近多次遇到这个问题,node16+版本安装或者初始化带有node-sass和sass-loader包的项目报错. 方法一: 卸载旧版本的node-sass和sass-loader,安装sass和sa ...

  6. python笔记:list--pop与remove的区别

    正常情况下: # coding=utf-8 fruit = ['apple', 'pear', 'banana' ] #指定索引删除 fruit.pop(0) #符合元素删除,具体数值 fruit.r ...

  7. verilog 硬件描述语言

    第一章 绪论 verilog--数字电路设计技术--ASIC/SOC芯片设计--协议pcie SATA USB--系统知识(个人计算机,芯片组,网络连接,嵌入式系统,硬件和软件的互操作) 第二章 寄存 ...

  8. MYSQL面试题大汇总

    1.数据库的三大范式是什么 1)列不可再分 2)行可以唯一区分 3)表的非主属性不可以依赖与其他表的非主属性,外键约束 2.数据库中的事务 1)什么是事务:多条sql语句,要么都成功,要么都失败 2) ...

  9. BubbleSort,冒泡排序,C++非递归和递归实现

    1 // g++ bubble_sort.cc -Wall -O3 && ./a.exe 2 3 4 #include <iostream> 5 #include < ...

  10. 游戏内存优化之使用16位纹理/NPOT

    转自:https://blog.csdn.net/oqqQuZi1234567/article/details/41749599 图片文件大小和纹理内存占用是两码事.假设他们是帐篷.图片文件就相当于帐 ...