前言

在redis版本6之前,网络IO和键值对读写都是由一个线程来完成的。而redis的其他功能,比如持久化、异步删除、集群数据同步等,是由其他线程完成的。

为什么采用单线程

多线程有助于提升吞吐率(系统同时处理的请求数),但处理共享资源时,会带来额外的开销。设计有问题时,采用多线程甚至会造成性能下降。为了减少并发访问控制问题,redis直接采用单线程模式。

redis的大部分操作都是在内存上完成的,而且redis采用哈希表、跳表等性能良好的数据结构,以及多路复用机制,使得redis在单线程模式下也能实现高性能和高吞吐率。

linux的IO多路复用机制

Linux的IO多路复用机制指的是一个线程处理多个IO流,即select/epoll机制。内核一直监听套接字的请求,一旦有相关请求,就交给redis处理,从而实现redis线程处理多个IO流的效果。

为了在请求到达时能通知到Redis线程,select/epoll提供了基于事件的回调机制,即针对不同事件的发生,调用相应的处理函数。相关事件被放到一个事件队列,redis单线程对该事件队列不断处理,避免一直轮询是否有请求发生造成CPU资源浪费。因为redis一直在处理事件队列,所以能及时响应请求。

redis单线程处理IO请求瓶颈

  1. 任意一个请求在server中一旦耗时较长,就会影响整个server的性能,也就是说,后面的请求都要等前面的先处理完。耗时操作包括以下几种:

    1. 操作big key:写入一个big key在分配内存时需要耗费一定时间。删除一个big key去释放内存也需要一定时间。
    2. 操作大量数据的命令。类似于mysql的select * from xxx的操作会占用大量时间。
    3. 大量key集中过期。
    4. 淘汰策略。内存不够用时,每次写入都要淘汰一些key,淘汰会耗时较长。
    5. AOF开启always机制,每次写入都将操作进行刷盘,拖慢redis性能
    6. 主从全量同步生成RDB:虽然采用fork子进程生成快照,但fork的一瞬间也会阻塞整个线程,实例越大,阻塞越久。
  2. 并发量非常大时,虽然采用了IO多路复用,但读写客户端数据依旧是同步IO,只能单线程依次读取客户端数据,无法利用CPU的多核。

redis6.0的多线程

redis6.0引入了多线程,但只是多线程处理网络IO请求,对于读写命令,redis仍然使用单线程处理。redis 6.0中,多线程机制默认是关闭的,相关配置:

# 启用多线程
io-threads-do-reads yes # 设置线程数。官方建议小于主机CPU核数
io-threads 6

参考

  • 极客时间 - Redis核心技术与实战

简述redis的单线程模式的更多相关文章

  1. 理解Redis的单线程模式

    0.概述 本文基于的Redis版本为4.0以下,在Redis更高版本中并不是完全的单线程了,增加了BIO线程,本文主要讲述主工作线程的单线程模式. 通过本文将了解到以下内容: Redis服务器采用单线 ...

  2. 为什么说Redis是单线程的以及Redis为什么这么快!(转)

    文章转自https://blog.csdn.net/chenyao1994/article/details/79491337 一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到 ...

  3. Redis与Reactor模式

    Redis与Reactor模式 Jan 9, 2016 近期看了Redis的设计与实现,这本书写的还不错,看完后对Redis的理解有非常大的帮助. 另外,作者整理了一份Redis源代码凝视,大家能够c ...

  4. 理解Redis的反应堆模式

    1. Redis的网络模型 Redis基于Reactor模式(反应堆模式)开发了自己的网络模型,形成了一个完备的基于IO复用的事件驱动服务器,但是不由得浮现几个问题: 为什么要使用Reactor模式呢 ...

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

    为什么说Redis是单线程的以及Redis为什么这么快!   一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”.什么是“热数据和冷数据”,复杂一点的会问到缓 ...

  6. redis和memcached有什么区别?redis的线程模型是什么?为什么单线程的redis比多线程的memcached效率要高得多(为什么redis是单线程的但是还可以支撑高并发)?

    1.redis和memcached有什么区别? 这个事儿吧,你可以比较出N多个区别来,但是我还是采取redis作者给出的几个比较吧 1)Redis支持服务器端的数据操作:Redis相比Memcache ...

  7. redis之为什么redis是单线程?

    官方FAQ表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽.既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的 ...

  8. 为什么说Redis是单线程的?

    一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”.什么是“热数据和冷数据” ,复杂一点的会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等问题,这些看 ...

  9. 为什么说Redis是单线程的以及Redis为什么这么块

    一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”.什么是“热数据和冷数据”,复杂一点的会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等问题,这些看似 ...

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

    一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”.什么是“热数据和冷数据”,复杂一点的会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等问题,这些看似 ...

随机推荐

  1. Hardhat 开发框架 - Solidity开发教程连载

    Decert.me 要连载教程了, <Solidity 开发教程> 力求系统.深入的介绍 Solidity 开发, 同时这是一套交互式教程,你可以实时的修改教程里的合约代码并运行. 本教程 ...

  2. 基于python爬虫技术对于淘宝的数据分析的设计与实现

    本篇仅在于交流学习 本文主要介绍通过 selenium 模块和 requests 模块,同时让机器模拟人在浏览器上的行为,登录指定的网站,通过网站内部的搜索引擎来搜索自己相应的信息,从而获取相应关键字 ...

  3. DVWA文件上传

    Low安全级别: <?php @eval($_POST['cmd']);?> 文本编辑器写入一句话木马,保存并改为php文件. 上传 成功上传,并返回路径 打开菜刀客户端连接 成功连接 反 ...

  4. 2022-06-30:以下golang代码输出什么?A:0;B:2;C:运行错误。 package main import “fmt“ func main() { ints := make

    2022-06-30:以下golang代码输出什么?A:0:B:2:C:运行错误. package main import "fmt" func main() { ints := ...

  5. 2022-01-24:K 距离间隔重排字符串。 给你一个非空的字符串 s 和一个整数 k,你要将这个字符串中的字母进行重新排列,使得重排后的字符串中相同字母的位置间隔距离至少为 k。 所有输入的字符串

    2022-01-24:K 距离间隔重排字符串. 给你一个非空的字符串 s 和一个整数 k,你要将这个字符串中的字母进行重新排列,使得重排后的字符串中相同字母的位置间隔距离至少为 k. 所有输入的字符串 ...

  6. Apache Arrow DataFusion原理与架构

    本篇主要介绍了一种使用Rust语言编写的查询引擎--DataFusion,其使用了基于Arrow格式的内存模型,结合Rust语言本身的优势,达成了非常优秀的性能指标 DataFusion是一个查询引擎 ...

  7. ET介绍——组件式设计(优化版的ECS)

    组件式设计 在代码复用和组织数据方面,面向对象可能是大家第一反应.面向对象三大特性继承,封装,多态,在一定程度上能解决不少代码复用,数据复用的问题.不过面向对象不是万能的,它也有极大的缺陷: 1. 数 ...

  8. c++函数参数和返回值

    c++函数参数和返回值 函数存储位置 函数参数入栈顺序 初始化列表 函数的返回值 用参数引用来返回 返回一个参数指针 返回一个对象 总结 函数的几种变体 inline 函数 函数对象 lambda 函 ...

  9. vst实例(2) 创建VST

    前面我们知道,创建一个虚拟树,应该首先告知VST节点数据的大小(即nodedatasize),其实在创建树结构时,这一点并不是必须的,而是如果你需要让VST的每一个节点能指向一定的数据,从而在执行树的 ...

  10. 曲线艺术编程 coding curves 第三章 弧,圆,椭圆(ARCS, CIRCLES, ELLIPSES)

    第三章 弧,圆,椭圆(TRIG CURVES) 原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池中物王二 ...