本篇重点

三个问题:

“Redis真的只有单线程吗?”
“为什么用单线程?”
“单线程为什么这么快?”

  1. “Redis真的只有单线程吗?”
  • 否,“单线程”指的是Redis的网络IO和键值对读写是由一个线程完成的[1]
  • Redis的其他功能由额外线程完成:持久化、异步删除、集群数据同步等
  • 网络IO和键值对读写即Socket编程中的如下步骤
    • 网络IO:bind/listen、accept、parse、send/recv
    • KV读写:GET/PUT...

  1. “Redis为什么用单线程?”
  • 多线程的开销:共享资源的并发访问控制,互斥锁等待,导致并转串
  1. “单线程Redis为什么那么快?”
  • 大部分操作在内存完成(硬件速度)
  • 高效数据结构(哈希表、跳表等)
  • IO多路复用机制:使其在网络IO中能并发处理大量客户端请求,实现高吞吐率
  1. 多路复用机制

网络操作的基本IO模型、潜在阻塞点(Redis采用单线程IO,若被阻塞将无法进行多路复用)

  • 基本IO模型:

  • 阻塞点:accept()、recv()、send()

  • Socket网络模型本身支持非阻塞模式

调用方法 返回套接字类型 非阻塞模式 效果
socket() 主动套接字
listen() 监听套接字 可设置 accept()非阻塞
accept() 已连接套接字 可设置 send()/recv()非阻塞
  1. 基于多路复用的高性能IO模型
  • Linux多路复用机制——一个线程处理多个IO流,如select/epoll
  • 基于多路复用的Redis高性能IO模型
  • 在请求到达时,如何通知到Redis线程?

    基于事件的回调机制(select/epoll提供)
    事件被放入事件队列,Redis单线程对该事件队列进行处理。

QA


“Redis基本IO模型”中的潜在性能瓶颈?

图片来源于极客时间专栏《Redis核心技术与实战》


  1. Redis6.0开始,将网络IO和键值对读写分开处理——网络请求解析线程(支持网络快速读写)、读写处理(主线程)

03 高性能IO模型:采用多路复用机制的“单线程”Redis的更多相关文章

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

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

  2. 高性能IO模型浅析

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking  ...

  3. 高性能IO模型浅析(彩图解释)good

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...

  4. 高性能IO模型浅析(转)

    转自:http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 是我目前看到的解释IO模型最清晰的文章,当然啦,如果想要详细的进一步了解还是继续啃蓝宝书 ...

  5. 【珍藏】高性能IO模型浅析

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...

  6. [转载] 高性能IO模型浅析

    转载自http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(B ...

  7. 转 高性能IO模型浅析

    高性能IO模型浅析 转自:http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: ( ...

  8. 【转载】高性能IO模型浅析

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...

  9. Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)

    Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...

随机推荐

  1. 【NX二次开发】创建老版的基准平面uf5374

    使用uf5374() 源码: double dP1[3] = { 0.0,0.0,0.0 }; double dP2[3] = { 0.0,1.0,0.0 }; double dP3[3] = { 0 ...

  2. 10个有趣又能编译为JavaScript的语言,你用过哪些?

    现代应用相比普通的网页有不同的要求.但是浏览器是一个有着一套(大部分)固定可用的技术的平台,JavaScript依然是web应用的核心语言:任何需要在浏览器上跑的应用都需要使用这种语言. 我们都知道J ...

  3. csp-s模拟测试42「世界线·时间机器·密码」

    $t3$不会 世界线 题解 题目让求的就是每个点能到点的数量$-$出度 设每个点能到的点为$f[x]$ 则$f[x]=x \sum\limits_{y}^{y\in son[x]} U f[y]$ 用 ...

  4. bzoj1925 地精部落

    神题! 地精部落 内存限制:128 MiB 时间限制:1000 ms 标准输入输出     题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度 ...

  5. MEMORY_TARGET不够时解决办法

    一.报错原因:设置的memory_max_target超过了系统中设置的share memory(/dev/shm)而已. 二.解决办法:增加tmpfs的大小 三.调整tmpfs的大小(两种方法) 1 ...

  6. 如何回答面试中问到的Hibernate和MyBatis的区别

    这边主要是写给那些准备去面试的(没什么经验的)应聘者看的,为了在面试中更好的回答这个问题,我做一个简单的梳理和总结. 作为一名职场新人,经历过多次的面试,由于在简历中提及了Hibernate和MyBa ...

  7. C、C++、python、Java、php、C#六种编程语言大PK 哪个好学习?

    作为程序员吃饭的工具,编程语言之间也形成了某种鄙视链,各大论坛里弥漫着剑拔弩张的气氛,众口难调.也难怪有很多初学者会有疑惑,为什么会有这么多编程语言,我到底应该学什么语言? 其实各种语言都各有千秋.接 ...

  8. 『无为则无心』Python序列 — 19、Python列表的其他操作(切片和遍历)

    目录 1.通过切片对列表的操作 (1)通过切片对列表进行修改 (2)通过切片对列表进行删除 (3)注意 2.列表的循环遍历 (1)while循环遍历 (2)for循环遍历 3.列表嵌套 4.综合示例 ...

  9. 23、swap分区扩充

    23.1.使用fdisk创建构建sapw: fdisk /dev/sdb=>分一个主分区/dev/sdb1(同理也可以使用parted mbr模式和parted gpt模式构建一个主分区) pa ...

  10. oracle查询用户所在表为空的表名

    1 select * from user_tables where num_rows = 0 查询之后发现查询的不全,查询之后发现num_rows为空 select * from user_table ...