• 单线程传奇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重写。

  • 相关阅读:
    【云原生 | 23】Docker运行Web服务实战之Tomcat
    电脑系统重装后音频驱动程序怎么修复
    Docker数据卷操作
    【Java Web】Spring整合Kafka
    Vue学习:计算属性
    React项目中如何实现一个简单的锚点目录定位
    使用这五个技巧,减少企业组织遭受凭证转储攻击的漏洞风险
    Vue(三)——组件化编程
    在线系统运行慢,对其进行性能分析以及处置的方法【总结】
    HP服务器硬盘坏了一块,教你如何快速更换
  • 原文地址:https://blog.csdn.net/citywu123/article/details/136162341