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快照文件生成;
    • 主从同步;
  • 相关阅读:
    PIE SDK SFIM融合
    PIE SDK PCA融合
    c# 粘贴复制
    dev gridview 单元格值拖拽替换
    sql 行数据找出最大的及所有数据最大的
    mvc 登陆界面+后台代码
    mvc控制器返回操作结果封装
    Java 未来行情到底如何,来看看各界人士是怎么说的
    Java工程师修炼之路(校招总结)
    ​为什么我会选择走 Java 这条路?
  • 原文地址:https://www.cnblogs.com/flyingaway/p/13807790.html
Copyright © 2011-2022 走看看