• 单线程传奇Redis,为何引入多线程?


    大家都知道 Redis 的速度非常的快,这其中一个关键原因就是它采用了单线程模型,这也是它的一大独特之处。那么问题来了,既然单线程模型已经如此出色,为什么后续版本还要搞上多线程呢?

    本文主要分析一下多线程在Redis中的具体应用:

    Redis 4.0 版本引入了对多线程的支持,但Redis 的基本执行模型仍然是单线程的,多线程主要包括后台对象删除、处理阻塞命令网络I/O等功能。这些操作可以在后台线程中异步执行,而不会直接影响到主线程的执行。这样设计的目的是提高一些操作的并发性和性能。

    以下是具体说明:

    后台对象删除: Redis 引入多线程的一个重要方面是实现后台异步删除过期对象。这允许在后台线程中异步地清理过期的键,而不会阻塞主线程的正常操作。这有助于提高系统的并发性和响应能力。

    阻塞命令和 Redis 模块: 多线程支持还包括在后台执行某些阻塞命令和 Redis 模块的功能。这允许一些耗时的操作在独立的线程中执行,而不会阻塞主线程,从而提高系统的性能。

    I/O 线程处理: 引入了对网络Redis Socket读写的不同 I/O 线程的支持。尤其是写入操作通常是性能瓶颈之一,通过将读写操作分配到不同的 I/O 线程,可以提高写入性能。

    尽管如此,Redis 仍然保留了其单线程执行模型的特点,主线程仍然负责处理客户端请求的事件循环。多线程主要用于执行一些后台任务,而不是用于并发处理主线程的操作。这样的设计在保持 Redis 简单性和高效性的同时,更好地适应了不同的应用场景和硬件环境。

    以下是一些Redis官方对多线程的介绍:

    Redis官方FAQ

    截至版本4.0,Redis已开始实施多线程操作。目前,这主要限于在后台删除对象以及通过Redis模块实现的阻塞命令。在后续的发布中,计划逐渐使Redis更加多线程化。

    Redis官方文档

    现在,可以使用不同的 I/O 线程来处理 Redis 客户端的套接字读写操作。由于写入操作通常比较慢,Redis 用户通常会使用管道化(pipelining)来提高每个核心的 Redis 性能,并创建多个实例以进行扩展。而使用 I/O 线程,可以轻松地将 Redis 的速度提高两倍,而无需使用管道化或分片。

    Github 6.0

    从这些文件的名称你就能猜到,它们实现了 Redis 的RDB和AOF持久化。Redis使用了基于fork()系统调用的持久化模型,以创建一个与主Redis线程具有相同(共享)内存内容的线程。这个辅助线程将内存的内容转储到磁盘上。rdb.c使用这个过程在磁盘上创建快照,而aof.c则用于在追加文件太大时执行AOF重写。

  • 相关阅读:
    javascript的深浅拷贝
    网络安全-渗透测试
    使用ppt和texlive生成eps图片(高清、可插入latex论文)
    Git --》如何玩转Gitee?
    <九> objectARX开发:读写Excel、json与txt格式文件
    Arduino ESP8266使用AliyunIoTSDK.h连接阿里云物联网平台
    【面试:并发篇31:多线程:cas】无锁实现并发
    红细胞装载阿霉素/羟基喜树碱/丹参酮IIA磺酸钠/地塞米松磷酸钠/维生素K1制备方法
    Log BERT 日志异常检测
    VS2019编译boost_1_79,生成32位和64位静态库
  • 原文地址:https://blog.csdn.net/citywu123/article/details/136162341