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;

相关推荐
小陈工2 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花6 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸6 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain6 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希7 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神7 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员7 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java7 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿7 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴7 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存