编程笔记

lifelong learning & practice makes perfect

redis|单线程的redis为什么快

redis为什么快

  1. 数据存储在内存中
    Redis完全基于内存存储数据,大部分请求是纯内存操作,速度极快。
    避免了传统磁盘文件数据存储的磁盘I/O开销。

  2. 高效的数据结构
    Redis有5种数据类型:String、List、Hash、Set、SortedSet。
    不同数据类型使用一个或多个底层数据结构支持,以实现更快的速度。

  3. 单线程架构
    单线程节省了上下文切换和CPU消耗的时间。
    没有竞态条件,无需考虑各种锁问题,避免了死锁导致的性能开销。
    允许使用各种“线程不安全”的命令,如Lpush。
    虽然是单线程,但Redis的其他功能(如持久化、异步删除、集群数据同步)由额外的线程执行。
    单线程易于实现,且CPU不会成为瓶颈,因此采用单线程方案。

  1. 非阻塞I/O
    基于网络I/O多路复用(非阻塞I/O)的线程模型,可以处理并发连接,缓解网络I/O速度慢的问题。
    多路复用I/O模型利用select、poll、epoll等同时监控多个流的I/O事件。
    当有I/O事件时,线程被唤醒并处理就绪的流,避免了大量无用操作。
    Redis的网络事件处理器基于Reactor模式,即文件事件处理器。
    文件事件处理器使用I/O多路复用同时监听多个socket,并将socket执行的任务与不同的事件处理器关联。
    虽然文件事件处理器是单线程的,但通过I/O多路复用监听多个socket,实现了高性能的网络通信模型。

redis的多线程

  1. Redis 6.0的多线程
    在Redis 6.0之前,未使用多线程以保持高可维护性。
    Redis 6.0引入多线程是因为网络I/O模块成为CPU时间的瓶颈。
    多线程用于处理网络I/O,充分利用CPU资源,减少网络I/O阻塞导致的性能损失。
    多线程模式下,接收、发送和解析命令可以配置为多线程执行,但命令执行(涉及内存操作)仍为单线程。
    因此,Redis的多线程部分仅用于处理网络数据读写和协议解析,命令执行仍按顺序执行,无并发安全问题。

  2. 如何启用多线程(Redis 6.0)
    默认情况下,多线程是禁用的,可以在conf文件中启用:

1
2
io-threads-do-reads yes 
io-threads [number of threads]

官方建议:4核机器设置2-3个线程,8核机器设置6个线程。线程数应小于机器核心数,尽量不超过8个线程。
通过以上分析,我们可以看到Redis单线程架构的高性能主要源于其内存存储、高效数据结构、单线程的简单性和非阻塞I/O的使用。而Redis 6.0引入的多线程则进一步优化了网络I/O处理,提升了整体性能。

ref

欢迎关注我的其它发布渠道