redis为什么这么快

  1. C语言实现,执行速度快
  2. 纯内存操作,数据读写在内存中,异步持久化到磁盘
  3. 丰富和高效的数据结构
  4. 基于非阻塞的I/O多路复用机制
  5. 单线程避免了上下文切换

Redis单线程

redis单线程的核心就是它基于一个假设:它在内存中执行的操作耗时很快,以至于多线程带来的收益小于其上下文切换和锁管理的消耗。

redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的,为什么呢,因为多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis 用 单个CPU 绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处理这个事。在内存的情况下,这个方案就是最佳方案 —— 阿里 沈询

  • redis 用 单个CPU 绑定一块内存的数据,针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成。对于多个CPU的机器可以使用多个redis实例绑定不同的CPU
  • redis的单线程模型指的是文件事件处理器单线程,即单线程的处理请求。但是它也有自己的一些后台线程,比如说删除大key
  • 并行与并发区别 :
    • 并行是为了快,多台处理器上同时处理多个任务
    • 并发是为了能够同一时间间隔做多个事情,一台处理器上“同时”处理多个任务,它一定是慢过串行

redis的单线程模型/通信流程

核心就两大块,IO多路复用模块支撑高并发请求,文件事件处理器单线程从队列中获取socket并调用相应的请求处理器

1、首先在redis启动初始化的时候,redis会先将事件处理器中的连接应答处理器和AE_READABLE事件关联起来;

2、如果客户端向redis发起连接,会产生AE_READABLE事,产生该事件后会被IO多路复用程序监听到(步骤B),然后IO多路复用程序会把监听到的socket信息放入到队列中(步骤C),事件分配器每次从队列中取出一个socket(步骤D),然后事件分派器把socket给对应的事件处理器(步骤E)。

3、当客户端向redis发生写请求时,首先就会在对应的socket如socket01上会产生AE_READABLE事件,产生该事件后会被IO多路复用程序监听到(步骤B),然后IO多路复用程序会把监听到的socket信息放入到队列中,事件分配器每次从队列中取出一个socket(步骤D),然后事件分派器把socket给对应的事件处理器(步骤E)。

5、当客户端会查询redis是否完成相应的操作,就会在socket01上产生一个AE_WRITABLE事件,会由对应的命令回复处理器来处理,就是将准备好的相应数据写入socket01(由于socket连接是双向的),返回给客户端,如读操作,客户端会显示ok。

6、如果命令回复处理器执行完成后,就会删除这个socket01的AE_WRITABLE事件和命令回复处理器的关联。

7、这样客户端就和redis进行了一次通信。由于连接应答处理器执行一次就够了,如果客户端再次进行操作就会由命令请求处理器来处理,反复执行。

Redis底层IO模型代码封装

我感觉不会问,但是阿里面经有,先放着先。

芋道源码:为什么 Redis 单线程能支撑高并发?

Redis6.0多线程

redis单线程的核心就是它基于一个假设:它在内存中执行的操作耗时很快,以至于多线程带来的收益小于其上下文切换和锁管理的消耗。

而现在这个假设在真实场景下发生了瓶颈:网络IO消耗,当value比较大时:

  • 从socket中读取请求数据,会从内核态将数据拷贝到用户态 (read调用)
  • 将数据回写到socket,会将数据从用户态拷贝到内核态 (write调用)

解决方案:

  1. 主线程负责接收建立连接请求,获取 socket 放入全局等待读处理队列
  2. 主线程接收完所有读事件之后,通过 RR(Round Robin) 将这些连接分配给 IO 线程组
  3. 主线程阻塞等待 IO 线程组读取 socket 完毕
  4. 主线程通过单线程的方式执行请求命令(指客户端发送的命令),请求数据读取并解析完成
  5. 主线程阻塞等待 IO 线程组将数据回写 socket 完毕
  6. 解除绑定,清空等待队列
  • 命令的执行依然由主线程单线程串行顺序执行(保持单线程)
  • I/O线程要么同时读,要么同时写,不会同时读或写
  • IO 线程只负责读写 socket 解析命令,不负责命令处理
  • 整个过程无锁参与
  • 多线程肯定要低于机器CPU核数,并行才能提高性能,并发只会浪费

为什么之前不使用多线程?

官方曾经回应:使用Redis时,几乎不存在CPU成为瓶颈的情况, Redis主要受限于内存和网络。引入多线程,引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。

那为什么现在又要用多线程了呢?

因为现在业务场景越来越复杂,对性能要求越来越高,所以对redis做出了提高性能的要求

整理来源

单线程模型讲解

单线程模型讲解

redis6.0

redis6.0多线程

单线程多线程_面试系列 redis为什么快amp;单线程amp;多线程相关推荐

  1. redis订阅执行一段时间自动停止_面试系列 redis 分布式锁amp;数据一致性

    分布式锁 多个系统同时操作一个redis,因为jvm锁是线程级别的,所以没有办法锁住多个系统. Redis锁实现: setnx key value 只有在key不存在时设置key的值 此时key相当于 ...

  2. amd同步多线程_流言终结者系列:第三代锐龙关同步多线程能增加游戏帧数?

    原标题:流言终结者系列:第三代锐龙关同步多线程能增加游戏帧数? 文 | Strike 关于AMD锐龙处理器玩游戏要关掉同步多线程(SMT)这传言其实已经流传已久,说真的这话放到以前可能还真的有这可能, ...

  3. 为什么集群要奇数_面试系列 redis数据删除amp;集群

    redis数据删除/内存淘汰 如果我们设置一批key只能存活1小时,那么1小时之后,redis是怎么对这批数据进行删除的? 答案:定期删数+惰性删除 (1)定期删除 指的是redis默认是每隔100m ...

  4. redis 多线程_唬人的Redis多线程,也就那么回事

    不羡鸳鸯不羡仙,一行代码调半天.原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处. 周末被一位小同学憋的很窝火. 他要和我探讨一下,redis到底是多线程的还是单线程的.这个 ...

  5. java中h5是什么_[ 面试系列 ] - 三:H5 是什么?

    系列文章 H5 和 HTML5 我想可能很多同学都和曾经的我一样,认为 H5 是 HTML5 的简写,所谓 H5 开发,就是遵循 HTML5 标准的前端开发而已.但事实并非如此,尽管 H5 这个词最早 ...

  6. 银行java面试题手写代码_面试系列——手写代码实现(一)

    前言 本文是面试系列篇的实现篇.笔者整理了面试过程中可能会遇到的手写实现,以及它的原理.这可以帮助面试者在笔试环节获得良好的加分. 其他文章系列,欢迎关注我文末的公众号 正文 apply和call a ...

  7. winform 统计大量数据重复的元素个数_面试系列:十个海量数据处理方法大总结...

    本文将简单总结下一些处理海量数据问题的常见方法.当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题.下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定 ...

  8. redis 设置不过期_面试时 Redis 内存淘汰总被问,但是总答不好,怎么解决?

    什么是内存淘汰 内存淘汰,和平时我们设置redis key的过期时间,不是一回事:内存淘汰是说,假设我们限定redis只能使用8g内存,现在已经使用了这么多了(包括设置了过期时间的key和没设过期时间 ...

  9. 全局索引 前缀索引_面试系列 索引种类与优化

    索引虽然快,但是占用了额外的空间,所以需要有一定权衡 覆盖索引 回表查询 InnoDB的普通索引无法直接定位行记录,所以普通索引的查询过程是怎么样的呢? 通常情况下,需要扫码两遍索引树.这就是所谓的回 ...

最新文章

  1. 苹果手机安装应用后无法上网问题的解决方法
  2. 收集:搜罗或看到的搞笑桥段
  3. 转 Wireshark和TcpDump抓包分析心得
  4. Linux-Ubuntu Server 16.04安装JDK以及配置JDK环境变量
  5. 树分治树链剖分相关题目讨论
  6. [深度学习] 自然语言处理--- 基于Keras Bert使用(下)
  7. 默认HotSpot最大直接内存大小
  8. 数据结构杂谈番外篇——时间复杂度计算
  9. 解决方案:加盐加密算法BCrypt
  10. 51nod1417 天堂里的游戏
  11. html 层次选择器,jquery层次选择器
  12. 会员分享几个平时看榜单常去的网站
  13. 硬件射频测试和软件的区别,细说拉力试验机软件与硬件之间的区别
  14. linux-通过BCM2835芯片手册进行IO操控的代码编程
  15. php货币2019年12月31日汇率,[外汇]2019年12月31日人民币汇率中间价新公告 今日美元兑人民币行情查询 - 南方财富网...
  16. Grammar-based construction 语法驱动的构造
  17. Springboot 日志、配置文件、接口数据脱敏
  18. Java sdut acm 2402 水杯
  19. 蓝牙功率放大器系统性能
  20. 动漫学日语《夏日重现》(更新中)

热门文章

  1. 字符串转16进制_16、atoi-整数字符串转整数-leetcode8-中等
  2. C/C++ 文件的后缀名
  3. 判断三角形是否是直角三角形
  4. 整数线性规划实现(matlab分枝界定法)
  5. 【youcans 的 OpenCV 例程 200 篇】112. 滤波反投影重建图像
  6. 三星s2 硬刷Android 8,三星T710(GALAXY Tab S2 8.0)一键救砖教程,轻松刷回官方系统...
  7. 【数据库】Mysql日期/时间函数实际案例
  8. Linux 查找目录下大于*M的文件
  9. 20172324 2017-2018-2《程序设计与数据结构》实验三报告
  10. Servlet添加商品