redis_redis为什么使用单线程
2025-01-22 08:19:30    647 字   
This post is also available in English and alternative languages.

通常说Redis是单线程,主要是指Redis的网络IO和键值对读写是由一个线程来完成的,这也是Redis对外提供键值存储服务的主要流程。

但Redis的其他功能,比如持久化、异步删除、集群数据同步等其实是由额外的线程执行的。

本篇是学习极客时间《Redis核心技术与实战#高性能IO模型:为什么单线程Redis能那么快?》的笔记


1. 为什么使用单线程

系统中采用多线程,但如果没有良好的系统设计,并不会像期望的那样提高系统吞吐量,反而会出现吞吐率增长迟缓甚至下降的情况。

采用多线程必定会牵扯出多线程访问共享资源的问题;
比如一个共享的数据结构,当有多个线程要修改这个共享资源时,为了保证共享资源的正确性就需要有额外的机制进行保证,而这个额外的机制就会带来额外的开销。

Redis中的List数据类型,提供出队(LPOP)和入队(LPUSH)操作。

假设Redis采用多线程设计,现在有两个线程A和B,线程A对一个List做LPUSH操作并对队列长度加1,同时线程B对该List执行LPOP操作并对队列长度减1。

为了保证队列长度的正确性,Redis需要让线程A和B的LPUSH和LPOP串行执行,这样一来,Redis可以无误地记录它们对List长度的修改。否则可能就会得到错误的长度结果。

究其根本是:多线程编程模式面临的共享资源的并发访问控制问题。

并发访问控制一直是多线程开发中的一个难点问题,如果没有精细的设计,比如说,只是简单地采用一个粗粒度互斥锁,就会出现不理想的结果:即使增加了线程,大部分线程也在等待获取访问共享资源的互斥锁,并行变串行,系统吞吐率并没有随着线程的增加而增加。

而且,采用多线程开发一般会引入同步原语来保护共享资源的并发访问,这也会降低系统代码的易调试性和可维护性;为了避免这些问题,Redis直接采用了单线程模式。


2. Reference

  • 极客时间 -《Redis核心技术与实战#高性能IO模型:为什么单线程Redis能那么快?》