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;

相关推荐
计算机毕设VX:Fegn089523 分钟前
计算机毕业设计|基于springboot + vue动物园管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
冉冰学姐1 小时前
SSM校园排球联赛管理系统y513u(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架应用·开题报告、
Tony Bai1 小时前
【分布式系统】03 复制(上):“权威中心”的秩序 —— 主从架构、一致性与权衡
大数据·数据库·分布式·架构
wb043072012 小时前
SQL工坊不只是一个ORM框架
数据库·sql
至善迎风2 小时前
Redis完全指南:从诞生到实战
数据库·redis·缓存
QQ_4376643144 小时前
Redis协议与异步方式
数据库·redis·bootstrap
纪莫4 小时前
技术面:MySQL篇(InnoDB事务执行过程、事务隔离级别、事务并发异常)
数据库·java面试⑧股
Nerd Nirvana5 小时前
数据库模型全景:从原理到实践的系统性指南
数据库·oracle·电力行业
SelectDB5 小时前
从 Greenplum 到 Doris:集群缩减 2/3、年省数百万,度小满构建超大规模数据分析平台经验
数据库·数据分析·apache
alonewolf_995 小时前
MySQL索引优化实战二:分页、关联查询与Count优化深度解析
数据库·mysql