• Redis性能篇(一)Redis内部的阻塞式操作及应对方法


    Redis被广泛使用的一个很重要的原因是它的高性能。因此我们必要要重视所有可能影响Redis性能的因素、机制以及应对方案。影响Redis性能的五大方面的潜在因素,分别是:

    这一讲,我们学习了解Redis内部的阻塞式操作以及应对方法。

    Redis实例有哪些阻塞点

    在分析阻塞点前,我们先来看看和Redis实例交互的对象和操作有哪些:

    • 客户端:网络IO,键值对增删改查操作,数据库操作;
    • 磁盘:生成RDB快照,记录AOF日志,AOF日志重写;
    • 主从节点:主库生成、传输RDB文件,从库接收RDB文件、清空数据库、加载RDB文件;
    • 切片集群实例:向其他实例传输哈希槽信息,数据迁移。

    这些交互操作可能会产生潜在的阻塞点。

    阻塞点

    • 集合全量查询和聚合操作:要重视复杂度为O(n)的操作。
    • bigkey删除:删除操作的本质是要释放键值对占用的内存空间,一下子释放了大量内存,会造成Redis主线程的阻塞。
    • 清空数据库:频繁删除键值对是潜在风险,清空数据库必然也是一个潜在风险。
    • AOF日志同步写:一个同步写磁盘的操作的耗时大约1~2ms,如果有大量写操作需要记录到AOF日志并同步写回,就会阻塞主线程。
    • 从库加载RDB文件:RDB文件越大,阻塞越久。

    哪些阻塞操作可以异步执行

    异步执行对操作的要求:如果一个操作 有被异步执行,意味着它不是Redis主线程的关键路径上的操作

    上面的五个阻塞点中,是关键路径操作的有:

    • 集合全量查询和聚合操作;
    • 从库加载RDB文件。

    异步执行机制

    下面我们来了解一下异步执行机制。主线程通过一个链表形式的任务队列和子线程进行交互,如下图所示:

    异步子线程执行机制

    Redis主线程启动后,会创建三个子线程来负责AOF日志写操作、键值对删除以及文件关闭的异步执行。

    异步的键值对删除和数据库清空操作是Redis 4.0后提供的功能,Redis也提供了新的命令来执行这两个操作:

    • 键值对删除:当你的集合类型中有大量元素(例如有百万级别或千万级别元素)需要删除时,我建议你使用UNLINK命令。
    • 清空数据库:可以在FLUSHDB和FLUSHALL命令后加上ASYNC选项,这样就可以让后台子线程异步地清空数据库。例如:FLUSHDB ASYNCFLUSHALL AYSNC

    建议

    • 集合全量查询和聚合操作:可以使用SCAN命令,分批读取数据,再在客户端进行聚合计算;
    • 从库加载RDB文件:把主库的数据量大小控制在2~4GB左右,以保证RDB文件能以较快的速度加载。

    参考资料

  • 相关阅读:
    C# TCP/IP 服务端 和 客户端
    (trigger)触发器的定义和作用
    AD账号登陆验证
    DES加密&解密字符串
    机器视觉(工业视觉)需要什么技能
    机器视觉对位贴合
    Halcon blob分析基本处理步骤
    cross_val_score 交叉验证与 K折交叉验证,嗯都是抄来的,自己作个参考
    50道SQL练习题及答案与详细分析(MySQL)
    MySQL8.0 ROW_NUMBER、RANK、DENSE_RANK窗口函数 分组排序排名
  • 原文地址:https://www.cnblogs.com/liang24/p/14231309.html
Copyright © 2020-2023  润新知