【Redis篇】Redis为什么这么快?Redis6.0之后变成多线程了?

1. Redis为什么这么快

1. 完全基于内存

绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中

2. 数据结构简单

对数据操作也简单,Redis中的数据结构是专门进行设计的

3. 采用单线程(不用CPU上下文切换、不用锁操作)

避免了CPU的上下文切换、资源竞争问题,不存在加锁释放锁操作,也没有死锁

4. 使用多路I/O复用模型(重要)

非阻塞IO(理解为监控室,忘了再百度以下)

1. 涉及的系统调用函数有哪些

selectpollepoll等,这些函数都可以同时监视多个描述符的读写就绪状况
在这里插入图片描述
图片来源:https://blog.51cto.com/u_12874079/2149260

2. 问:什么是多路I/O复用模型?

利用系统调用函数 ,使多个描述符的I/O操作都能在一个线程内并发交替地顺序完成(理解为监控室可以看到多个摄像头的视频,做统一监控)

这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程(单线程),redis同时对多个IO进行监控

参考相关链接:
什么是多路I/O复用模型
redis的多路复用是什么鬼

5. 使用VM机制(冷热数据分离)

使用VM机制作为底层模型,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求

白话文:VM机制就是可以实现冷热数据分离。使热数据仍在内存中,冷数据保存到磁盘。

2. Redis6.0之后为什么变成多线程了?(部分多线程)

1. 为啥要引入多线程?单线程不香吗(网络IO太慢了)

网络 IO 的读写在 Redis 整个执行期间占用了大部分的 CPU 时间,如果把网络处理这部分做成多线程处理方式,那对整个 Redis 的性能会有很大的提升。

白话文:为了加快网络IO操作

1. 引入多线程是不是意味着有并发问题了?

不是的,多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程

2. Redis6.0默认是没有开启线程模式的

在redis.conf文件里配置以下2个参数(一个是开关、一个是线程数目),可以开启:

io-threads-do-reads yes

io-threads 线程数

上面的线程数一般要少于CPU的核数,如果是8核CPU,建议配置6个线程(官方建议的)

3. Redis的多线程的实现原理

在这里插入图片描述
咋看怎么有点像是多路IO复用模型的功能呀?TODO
在这里插入图片描述
图片来源:https://blog.csdn.net/weixin_39098944/article/details/107869323

  1. 主线程负责接收建立连接请求,获取 Socket 放入全局等待读处理队列
  2. 主线程处理完读事件之后,通过 RR(Round Robin)将这些连接分配给这些 IO 线程
  3. 主线程阻塞等待 IO 线程读取 Socket 完毕(等IO多线程读取完)
  4. 主线程通过单线程的方式执行请求命令,请求数据读取并解析完成,但并不执行(单线程执行命令)
  5. 主线程阻塞等待 IO 线程将数据回写 Socket 完毕
  6. 解除绑定,清空等待队列

白话文:1. 主线程阻塞,等多线程接收IO完毕,并放到队列后,主线程才开始运行 2. 还是用单线程的方式去处理命令,不存在并发问题

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值