• Redis 6.0多线程介绍


    0. 背景

    Redis作为一个基于内存的缓存系统,一直以高性能著称,
    在单线程处理情况下,读速度可达到11万次/s,写速度达到8.1万次/s。

    Redis6.0之前为什么一直不使用多线程?
    官方曾做过类似问题的回复:使用Redis时,几乎不存在CPU成为瓶颈的情况, Redis主要受限于内存和网络。

    但是,单线程的设计也给Redis带来一些问题:

    • 只能使用CPU一个核
    • 如果删除的键过大(eg: Set类型中有上百万个对象),会导致服务端阻塞好几秒
    • QPS难再提高

     针对上面问题,Redis在4.0版本以及6.0版本分别引入了Lazy Free以及多线程IO,逐步向多线程过渡。

    1. Redis单线程架构原理

    Redis单线程是如何支持客户端并发请求的呢?

    Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:

    文件事件

    Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接。
    文件事件就是服务器对套接字操作的抽象。

    服务器与客户端的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。
    (eg: 连接accept,read,write,close等)


    时间事件

    Redis服务器中的一些操作(eg: serverCron函数)需要在给定的时间点执行。
    时间事件就是服务器对这类定时操作的抽象。
    (eg: 过期键清理,服务状态统计等)


    Redis将文件事件和时间事件进行抽象,时间轮询器会监听I/O事件表:
    一旦有文件事件就绪,Redis就会优先处理文件事件,
    接着处理时间事件。
    在上述所有事件处理上,Redis都是以单线程形式处理,所以说Redis是单线程的。
    处理过程见下图

    Redis基于Reactor模式开发了自己的I/O事件处理器,也就是文件事件处理器。
    Redis在I/O事件处理上,采用了I/O多路复用技术,同时监听多个套接字,
    并为套接字关联不同的事件处理函数,通过一个线程实现了多客户端并发处理。
    处理过程见下图

    上述的设计,在数据处理上避免了加锁操作,既使得实现上足够简洁,也保证了其高性能。
    当然,Redis单线程只是指其在事件处理上,实际上,Redis也并不是单线程的,比如生成RDB文件,就会fork一个子进程来实现。

    2. Redis 4.0的Lazy Free机制

    背景:
    客户端向Redis发送一条耗时较长的命令,比如删除一个含有上百万对象的Set键,或者执行flushdb,flushall操作,
    Redis服务器需要回收大量的内存空间,导致服务器卡住好几秒,对负载较高的缓存系统而言将会是个灾难。

    为了解决这个问题,在Redis 4.0版本引入了Lazy Free,将慢操作异步化,这也是在事件处理上向多线程迈进了一步。

    将大键的删除操作异步化,采用非阻塞删除(对应命令UNLINK)。
    大键的空间回收交由单独线程实现,主线程只做关系解除,可以快速返回,继续处理其他事件,避免服务器长时间阻塞。

    意义:
    Redis在4.0版本引入了Lazy Free,自此Redis有了一个**Lazy Free线程专门用于大键的回收**。
    同时,也去掉了聚合类型的共享对象,这为多线程带来可能。
    这为Redis在6.0版本实现了多线程I/O打下了基础。

    3. Redis 6.0多线程实现机制

    流程简述如下:
    1、主线程负责接收建立连接请求,获取 socket 放入全局等待读处理队列
    2、主线程处理完读事件之后,通过 RR(Round Robin) 将这些连接分配给这些 IO 线程
    3、主线程阻塞等待 IO 线程读取 socket 完毕
    4、主线程通过单线程的方式执行请求命令,请求数据读取并解析完成,但并不执行
    5、主线程阻塞等待 IO 线程将数据回写 socket 完毕
    6、解除绑定,清空等待队列

    见下图

    4. Redis6.0多线程的设置

    Redis6.0的多线程默认是禁用的,只使用主线程。
    如需开启需要修改redis.conf配置文件:

    io-threads-do-reads yes

    开启多线程后,还需要设置线程数,否则是不生效的。
    同样修改redis.conf配置文件:

    io-threads  4
    技术改变世界
  • 相关阅读:
    小例子-使用JS/JQ获取a标签的href网址
    R语言随手记-线性回归模型诊断
    R语言随手记-数据处理
    正选择分析-PAML discussion group
    ggtree-基本函数使用
    PhastCons
    R语言随手记-批量读取和循环处理多个数据文件
    变异位点有害性软件评估
    ggplot画图-分页and排序
    R画图-标题和坐标轴篇
  • 原文地址:https://www.cnblogs.com/davidgu/p/14697963.html
Copyright © 2020-2023  润新知