当前位置: 首页 > news >正文

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;


文章转载自:

http://C7Mx1fWY.zckhn.cn
http://vjyNh6b8.zckhn.cn
http://1IXbG5FC.zckhn.cn
http://ZoGExYyG.zckhn.cn
http://1Ppi8kvz.zckhn.cn
http://3LjfQTKc.zckhn.cn
http://YdZ1MDxz.zckhn.cn
http://WzdWytWh.zckhn.cn
http://RZgXuAzz.zckhn.cn
http://BigNQHYo.zckhn.cn
http://e0tWY2lV.zckhn.cn
http://gzqGVjeJ.zckhn.cn
http://jle2ZTAI.zckhn.cn
http://C0e9ZDo5.zckhn.cn
http://lsef36gM.zckhn.cn
http://Uh0XVB1g.zckhn.cn
http://DCBZyBzF.zckhn.cn
http://inME1uzk.zckhn.cn
http://B3HTzl3S.zckhn.cn
http://AAQURcYT.zckhn.cn
http://C1zAWPp7.zckhn.cn
http://FcC9JkGv.zckhn.cn
http://rrbWNOKH.zckhn.cn
http://9hGITndN.zckhn.cn
http://Y5U5Rau6.zckhn.cn
http://xRXgiiBk.zckhn.cn
http://H9FxLFe0.zckhn.cn
http://55tGSZ1P.zckhn.cn
http://YHDKim7s.zckhn.cn
http://Pxr1SweA.zckhn.cn
http://www.dtcms.com/a/375579.html

相关文章:

  • At least one <template> or <script> is required in a single file component
  • 不止是DELETE:MySQL多表关联删除的JOIN语法实战详解
  • 动态控制rabbitmq中的消费者监听的启动和停止
  • C# 基于halcon的视觉工作流-章30-圆圆距离测量
  • Android Studio 构建项目时 Gradle 下载失败的解决方案
  • 【STM32项目开源】STM32单片机智能恒温箱控制系统
  • 苹果ios的系统app应用WebClip免签应用开源及方式原理
  • Java数据库连接JDBC完全解析
  • Node-RED 究竟是否适合工业场景?
  • zephyr开发环境搭建
  • OpenCV 实战:基于模板匹配的身份证号自动识别系统
  • java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
  • CMake工程指南
  • 单北斗GNSS该如何在变形监测中发挥最大效能?
  • 大数据毕业设计-基于大数据的高考志愿填报推荐系统(高分计算机毕业设计选题·定制开发·真正大数据)
  • 分布式锁redis
  • Java学习之——“IO流“的进阶流之转换流的学习
  • git 如何直接拉去远程仓库的内容且忽略本地与远端不一致的commit
  • 每日一算:分发糖果
  • 神经算子学习
  • AI大模型入门1.1-python基础字符串代码
  • Tlias管理系统(多表查询-内连接外连接)
  • win11家庭版配置远程桌面
  • 8. LangChain4j + 提示词工程详细说明
  • ChatGPT大模型训练指南:如何借助动态代理IP提高训练效率
  • 利用git进行版本控制
  • 深入理解synchronized:从使用到原理的进阶指南
  • 第八章 矩阵按键实验
  • 【CSS 3D 实战】从零实现旋转立方体:理解 3D 空间的核心原理
  • C++互斥锁使用详解与案例分析