• 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快照文件生成;
    • 主从同步;
  • 相关阅读:
    【.Net】多语言查看MSDN
    【.Net】 显示星期字符串
    【.Net】 判断时间字符串正确性
    【.Net】 实现窗口拖动
    【.Net】 Winform 单例运行实例
    Kendo 计算字段
    Kendo UI 的 k-template
    UpdatePanel中用后台CS代码调用JS代码,先执行控件事件,后触发JS
    SQL常用
    Node.js 安装
  • 原文地址:https://www.cnblogs.com/flyingaway/p/13807790.html
Copyright © 2020-2023  润新知