zoukankan      html  css  js  c++  java
  • 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快照文件生成;
    • 主从同步;
  • 相关阅读:
    洛谷—— P2234 [HNOI2002]营业额统计
    BZOJ——3555: [Ctsc2014]企鹅QQ
    CodeVs——T 4919 线段树练习4
    python(35)- 异常处理
    August 29th 2016 Week 36th Monday
    August 28th 2016 Week 36th Sunday
    August 27th 2016 Week 35th Saturday
    August 26th 2016 Week 35th Friday
    August 25th 2016 Week 35th Thursday
    August 24th 2016 Week 35th Wednesday
  • 原文地址:https://www.cnblogs.com/flyingaway/p/13807790.html
Copyright © 2011-2022 走看看