Redis单线程工作原理

1. 为什么使用单线程?

多线程操作存在共享资源并发控制的问题,必定要引入锁,使系统更加复杂且难于调试。为了降低系统的复杂度,更加易于调试及维护,redis在**主流程操作**上使用的是单线程模式;

2. 哪些方面是单线程?

主流程的操作,主要是读写操作。

3. 为什么单线程还那么快?

  •  主流程在直接操作内存的;
  •  使用高效的数据结构,例如哈希表和跳表,提升数据的存取速度;
  •  使用NIO模式,多路复用的高性能IO模型,降低了IO带来的阻塞时间;

4. 单线程的阻塞点?

  • big key的操作。因为bigkey在维护内存时需要更多的时间,同时big key在IO传输时也需要更多的时间;
  • 复杂的操作。例如聚合、全量查询;(Redis 4.0之后引入了lazy-free,将bikey释放内存的耗时操作房子了异步线程中执行)。
  • 大量key集中过期。因为Redis的过期机制也是在主流程中完成的,大量的key集中过期也会导致Redis主流程集中处理删除这些key,导致耗时过长;
  • AOF写日志。如果开启AOF写日志模式为always,则每次都要把操作日志写到磁盘,而磁盘的读写速度一般都会比内存操作慢;
  • RDB快照文件的生成。虽然保持或主从同步RDB快照都是在不同的进程中执行的,但是fork生成子进程的过程是在主进程中执行的,这个过程如果数据量很大,会比较耗时;
  • 并发量大。虽然Redis采用了NIO模式来处理IO,但是读写数据依然是单线程,这就无法使用多核;(Redis 6.0引入多线程来同步IO读写,但是内存操作还是单线程执行的)。
  • CPU上下文切换。如果是使用多核CPU,那么指令在运送到CPU处理时,可能会运送到不同的核进行处理,这个时候就需要CPU拷贝原线程的上下文到当前核,这也会消耗时间。

5. 异步操作点有哪些?

  • AOF重写;
  • RDB快照文件生成;
  • 主从同步;
原文地址:https://www.cnblogs.com/flyingaway/p/13807790.html