目录
1. Redis为什么这么快
1. 完全基于内存
绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中
2. 数据结构简单
对数据操作也简单,Redis中的数据结构是专门进行设计的
3. 采用单线程(不用CPU上下文切换、不用锁操作)
避免了CPU的上下文切换、资源竞争问题,不存在加锁释放锁操作,也没有死锁
4. 使用多路I/O复用模型(重要)
非阻塞IO(理解为监控室,忘了再百度以下)
1. 涉及的系统调用函数有哪些
select、poll、epoll等,这些函数都可以同时监视多个描述符的读写就绪状况
图片来源: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.youkuaiyun.com/weixin_39098944/article/details/107869323
- 主线程负责接收建立连接请求,获取 Socket 放入全局等待读处理队列
- 主线程处理完读事件之后,通过 RR(Round Robin)将这些连接分配给这些 IO 线程
- 主线程阻塞等待 IO 线程读取 Socket 完毕(等IO多线程读取完)
- 主线程通过单线程的方式执行请求命令,请求数据读取并解析完成,但并不执行(单线程执行命令)
- 主线程阻塞等待 IO 线程将数据回写 Socket 完毕
- 解除绑定,清空等待队列
白话文:1. 主线程阻塞,等多线程接收IO完毕,并放到队列后,主线程才开始运行 2. 还是用单线程的方式去处理命令,不存在并发问题