Redis 6 的多线程

梦楼 2021-05-04 16:41:45
redis 多线程 线程 数据库/缓存 墨滴


昨天和同事聊Redis,他问我Redis学的怎么样,我说学的还行,然后他突然问一句“你知道Redis现在已经支持多线程了吗?”,我当时愣了一下,Redis不是一直是单线程么,怎么突然支持多线程了?瞬间感觉被秒,赶紧回来查阅一下相关资料,要不然以后都不敢说自己会Redis了

Redis知识回顾

我们先回顾一下Redis单线程模式的相关知识,我们都知道Redis快的主要原因是因为epool I/O复用模型,我们简单探讨一下:

  • 首先,Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务,而 I/O 多路复用就是为了解决这个问题而出现的。
  • 多路I/O复用模型是利用 select、poll、epoll 可以同时监听多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。
  • 这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量

下图是Redis的内部核心流程图(也是我能找到的比较经典的介绍Redis的原理图),内部其实主要是通过双向队列和红黑树实现(图画的很详细,里面不懂的知识,可以直接百度,很容易找到):

Redis单线程

对于一个请求操作,Redis主要做3件事情:从客户端读取数据、执行Redis命令、回写数据给客户端(如果再准确点,其实还包括对协议的解析)。所以主线程其实就是把所有操作的这3件事情,串行一起执行,因为是基于内存,所以执行速度非常快:

优点 VS 缺点:

优势:

  • 不存在锁的问题
  • 避免线程间CPU切换 缺点:
  • 单线程无法利用多CPU
  • 串行操作,某个操作“出问题”会“阻塞”后续操作

Redis多线程

Redis多线程的优化思路:因为网络I/O在Redis执行期间占用了大部分CPU时间,所以把网络I/O部分单独抽离出来,做成多线程的方式。

这里所说的多线程,其实就是将Redis单线程中做的这两件事情“从客户端读取数据、回写数据给客户端”(也可以称为网络I/O),处理成多线程的方式,但是“执行Redis命令”还是在主线程中串行执行,这个逻辑保持不变。

可能有同学会问,主线程和多个I/O线程,都同时处理图中的“队列”,是不是会存在锁竞争的关系呢?这里有个巧妙的设计,就是当epoll获取socket链接时,会将该事件先全部扔进队列中,比如扔了N个事件,这时主线程就会处于忙等(spinlock自旋锁的效果)状态。然后多个I/O线程开始去并行进行网络I/O,并对数据进行协议解析,当队列全部处理完毕后,主线程会对队列中请求串行““执行Redis命令”,然后清空该队列。所以整个执行流程总结下来:主线程执行请求入队列 -> I/O线程并行进行网络读 -> 主线程串行执行Redis命令 -> I/O线程并行进行网络写 -> 主线程清空队列,并接收下一批请求。

优点 VS 缺点

优点:

  • 提高响应速度,充分使用CPU 缺点:
  • 增加了代码复杂性

总结

  • Redis的多路复用技术,支持epoll、kqueue、selector;
  • 5.0版本及以前,处理客户端请求的线程只有一个,串行处理;
  • 6.0版本引入了worker Thread,只处理网络IO读取和写入,核心IO负责串行处理客户端指令。

欢迎大家多多点赞,更多文章,请关注微信公众号“楼仔进阶之路”,点关注,不迷路~~

版权声明
本文为[梦楼]所创,转载请带上原文链接,感谢
https://mdnice.com/writing/abb4dcaadd4d418d804da3bd7438439e

  1. Realization of reactor Kafka through spring boot Webflux
  2. RPC框架设计----Socket与I/0模型
  3. Problems in upgrading from Java 8 to Java 11
  4. RPC framework design -- socket and I / 0 model
  5. RPC框架设计----I/0模型
  6. RPC framework design: I / 0 model
  7. RPC框架设计----NIO编程缓冲区Buffer
  8. RPC框架设计----NIO编程缓冲区Buffer
  9. RPC framework design -- NiO programming buffer
  10. RPC framework design -- NiO programming buffer
  11. Java多线程基础
  12. Java multithreading Foundation
  13. 码农飞升记-00-Java发展历程
  14. Development history of coder-00-java
  15. 码农飞升记-00-Java发展历程
  16. Development history of coder-00-java
  17. Spring and Autumn Moon
  18. Node.js与Spring Boot比较? - Ryan Gleason
  19. Spring WebFlux的明显陷阱 - ŁukaszKyć
  20. Spring创始人Rod大叔对YAML的真实想法
  21. Compare node.js with spring boot- Ryan Gleason
  22. Obvious pitfalls of spring Webflux- Ł ukaszKy ć
  23. Spring founder uncle rod's real thoughts on yaml
  24. 码农飞升记-02-OracleJDK是什么?OracleJDK的版本怎么选择?
  25. What is manong feisheng-02-oracle JDK? How to choose the version of Oracle JDK?
  26. Spring tide surging Xinanjiang
  27. Linux内核软中断
  28. Linux kernel soft interrupt
  29. Linux内核软中断
  30. Linux kernel soft interrupt
  31. Java multithreading Foundation
  32. The construction of Maven private library nexus
  33. I / O stream in Java
  34. JDK 16:Java 16的新功能 - InfoWorld
  35. 在Java中本地进行线程间数据传输的三种方式和源码展示
  36. jdon导致cpu 99%最后tomcat死掉---banq给予回复
  37. 用领域事件模拟AOP注入
  38. JDK 16: new function of Java 16 - InfoWorld
  39. Cartoon: from JVM lock to redis distributed lock
  40. Spring 3.1 终于加入了Cache支持
  41. Prototype与JQuery对比
  42. Three ways of data transmission between threads in Java and source code display
  43. Jdon causes 99% of CPU and Tomcat dies -- banq replies
  44. docker 原理之 user namespace(下)
  45. Simulating AOP injection with domain events
  46. Spring 3.1 finally adds cache support
  47. Comparison between prototype and jquery
  48. User namespace of docker principle (2)
  49. The way to learn java IO stream and XML
  50. Why does a seemingly correct code cause the Dubbo thread pool to be full
  51. 0 基础 Java 自学之路(2021年最新版)
  52. 0 basic Java self study road (latest version in 2021)
  53. c#—基础拾遗(1) 面向对象
  54. C - basic information (1) object oriented
  55. 技术分享|SQL和 NoSQL数据库之间的差异:MySQL(VS)MongoDB
  56. Technology sharing differences between SQL and NoSQL databases: MySQL (VS) mongodb
  57. PHP教程/面向对象-3~构造函数和析构函数
  58. Spring Cloud的Feign客户端入门
  59. 优化Spring Boot应用的Docker打包速度
  60. PHP tutorial / object oriented - 3 ~ constructor and destructor