Redis单线程模型为什么快?

Redis的单线程模型指的是redis只使用一个线程来出来所有的命令式指令,但是不是意味着redis内部就只使用一个线程来处理所有的任务。都知道redis是一个客户端-服务器的程序,那么redis就只有一个服务器,但是有多个客户端,就像mysql一样,mysql也是一个客户端-服务器程序;

既然redis有多个客户端,哪有人就会问了:会不会有线程安全问题呢?比如两个客户端都同时来修改redis的一个变量,比如都对变量进行+1操作,如果在java中,你使用两个线程来同时修改一个变量,那就有可能是只加了一次,但是在redis中是不会有线程安全问题的,因为redis是单线程的,同一个时刻只能处理一个命令,其他的命令都得阻塞等待;

redis的单线程有好处也有坏处,好处就是不会出现线程安全问题,那我们日常写代码的时候为什么也不就使用单个线程呢?虽然单个线程不会出现线程安全问题,但是执行效率慢呀,但是慢是相比较多线程来说的,一个任务你可以分为10个线程来执行,那你只需要1/10的时间,但是你使用单线程就得多花费9倍的时间;单线程还有一个好处就是没有线程竞争的开销,所以会更快一点?有人就要质疑了,一会说redis快,一会说redis慢,那到底是快还是慢呢?这个快和慢都是相比较而言的;回归主题,为什么redis的单线程模型快呢?

1、redis操作的是内存的,而mysql操作的是硬盘

都知道操作内存的速度肯定是比操作硬盘的速度快的,而且快的不是一点点;

2、redis的核心业务更简单

redis相比较mysql的增删查改任务更简单,mysql的数据的变化都会受到约束,所以就更慢了,redis的逻辑就更简单了,通常来说redis插入键值对受到的约束非常少,受到的约束少就说明开销更少,速度当然就跟快了;

3、redis的单线程模型没有线程竞争开销

线程竞争的开销是很大的,涉及到锁的创建,锁的竞争,锁的释放等等,单线程模式避免了这样的竞争开销了,所以会更快;

4、redis处理网络IO时,使用epoll这样的IO多路复用机制

Linux的IO多路复用机制其实有三种:select,poll,epoll,但是自从3.2开始,redis就坚持使用epoll这样的机制处理网络IO;

这个机制说来也简单,redis服务器和客户端是通过TCP连接通讯的,redis服务器的客户端可以有很多个,服务器就会对每一个客户端创建一个socket,而且redis只使用一个线程来管理多个socket。难道一个线程来管理多个socket不会处理不过来吗?其实redis服务器是处理得过来的,虽然每一个客户端都分配一个socket,但是不是每一个客户端都每时每刻跟服务器保持通讯的,有可能连接一分钟,实际通讯只有100ms,那么其他的时刻其他客户端就可以和服务器进行通讯,通过这样的机制就避免了一个socket分配一个线程的开销,一个线程的开销不大,但是多个socket,多个线程开销就很大了;

举个例子来说明一下:

如果只有我一个人来处理三件事情,事件A-买炒饭、事件B-买水饺、事件C-买煎饼果子,我有三种办法来处理这件事情,第一种方法就是我先去买炒饭,等炒饭好了我再去买水饺,等水饺好了,我再去买煎饼果子,虽然这样能完成任务,但是开销很大,等的时间太长了;

第二种办法就是:我去买炒饭,再安排两个人,一个人去买水饺,一个人去买煎饼果子,虽然这样总的时间变少了,但是使用了三个人,开销也很大了,这里说的就是一个socket分配一个线程;

第三种办法就是:我先去买炒饭,让老板炒好了叫我一声,在老板炒饭的过程中,我去买水饺,也让老板水饺煮好了叫我一声,这个过程我去买煎饼果子,然后我就等,谁好了就叫我一声我去拿,这样开销最,而且效率最高,使用的机制就是epoll的事件通知/回调机制

epoll属于是操作系统为程序员提供的一种机制,提供了一组API,内部的功能都是操作系统实现;

C\C++使用的及时poll,epoll这样的机制,而Java使用的是NIO,是标准库提供了一组类,底层也是封装了epoll;

相关推荐
吴声子夜歌15 分钟前
SQL经典实例——检索记录
数据库·sql
黄焖鸡能干四碗15 分钟前
软件系统概要设计说明书模版(Word)
大数据·运维·数据库·架构·需求分析
dust_and_stars23 分钟前
为什么ubuntu24 snap install code-server 不需要--classic?
网络·数据库
BomanGe227 分钟前
NSK W1406FA系列长行程高速精密丝杠技术指南
运维·服务器·数据库·经验分享·规格说明书
之歆31 分钟前
MongoDB 深度解析:从原理到实践的完整指南
数据库·mongodb
一 乐33 分钟前
幼儿园管理系统|基于springboot + vue幼儿园管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·幼儿园管理系统
tiancaijiben34 分钟前
阿里云日志服务SLS全流程对接与深度使用指南
网络·数据库
云计算磊哥@36 分钟前
运维开发宝典028-MySQL04数据库热备
数据库·adb·运维开发
五阿哥永琪1 小时前
正则表达式
数据库·mysql·正则表达式
LaughingZhu1 小时前
Product Hunt 每日热榜 | 2026-06-13
数据库·mysql