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

零基础学习Redis(5) -- redis单线程模型介绍

前面我们提到过,redis是单线程的,这期我们详细介绍一下redis的单线程模型

1. redis单线程模型

redis只使用一个线程处理所有的请求,并不是redis服务器进程内部只有一个线程,其实也存在多个线程,只不过多个线程是在处理网络IO

假设有多个客户端同时操作一个redis服务器:

incr 作用是把key对应的value进行 + 1操作,在多线程中,这样的两个线程对一个变量进行写操作会导致线程安全问题,但是redis并不会,redis只会使用一个线程来指向这个两个命令,也就是这两个命令会串行执行。

因为redis的核心业务逻辑都是平短快的,所以使用单线程也能很好的工作,同时这里也提醒我们慎重使用操作时间长的操作,例如keys *

2. redis为什么快

有的人可能会疑惑,为什么redis使用单线程确还很快(面试题)

注意这里的快是相对于使用硬盘存储的数据库来说

1. redis 访问内存,数据库则是访问硬盘

2. redis 核心功能是要比数据库更简单的,数据库对数据的插入删除查询都有更复杂的功能支持

3. redis每个基本操作对cpu的消耗都不大,单线程也能很好的进行工作

4. redis处理IO的时候使用了IO多路复用机制

3. IO多路复用

IO多路复用就是使用一个线程管理多个连接

例举一个场景:

小明寝室有三个人要出去买午饭,小明想吃蛋炒饭,室友A想吃饺子,室友B想吃炒面,但是这几家店不在同一个位置,现在有几种买饭的方案:

  1. 只派一个人去买,先买蛋炒饭,等蛋炒饭做好了再去买饺子,最后去买炒面(传统的单线程,顺序执行)
  2.  三个人一起去买,各买各的(多线程)
  3. 只派一个人去买,先去买蛋炒饭,这里不等老板做好直接去买饺子,同理,然后去买炒面,哪个先做好先去拿哪个(IO多路复用)

可以看出,传统的单线程效率最慢,而多线程的话开销又太大,所以有了IO多路复用就可以让一个线程,在一个连接阻塞时去处理另一个连接,不过要注意IO多路复用适用于连接和服务器的交互不频繁,大部分时间都在等待的场景,如果交互过于频繁还是使用多线程更合理。

IO多路复用机制是操作系统提供的API实现的,Linux上主要提供了三种API:select,poll,epoll

效率最高的是epoll(事件通知/回调机制) 即连接退出阻塞时操作系统通知线程。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Mybatis笔记的后续补充
  • 用C#写一个随机音乐播放器
  • 【现代通信技术】第八章 SDH技术
  • 探索顶级PDF水印API:PDFBlocks(2024年更新)
  • LCD 图片格式转换
  • FreeRTOS 快速入门(三)之任务管理
  • ensp小实验(ospf+dhcp+防火墙)
  • PHP模拟高并发异步请求测试+redis的setnx处理并发和防止死锁处理
  • PINCE——Linux 原生游戏内存修改器,一款替代 Cheat Engine 的强大游戏修改器,Linux 游戏玩家必备神器!
  • 【论文学习与撰写】论文中公式的编辑,Mathtype的使用,全文编号排版,智能截图识别公式,公式编号自动更新
  • 一键更换Linux优质的软件源和docker源 —— 筑梦之路
  • 超全MySQL优化清单
  • 如何在ThinkPHP6中轻松实现WebSocket通信?看这里就够了!
  • 【HarmonyOS NEXT星河版开发学习】综合测试案例-各平台评论部分
  • 【javaEE进阶1】spring简介IoC
  • 收藏网友的 源程序下载网
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • CentOS7简单部署NFS
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JavaScript学习总结——原型
  • Java深入 - 深入理解Java集合
  • JS 面试题总结
  • JS+CSS实现数字滚动
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux下的乱码问题
  • Next.js之基础概念(二)
  • Phpstorm怎样批量删除空行?
  • Quartz初级教程
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 缓存与缓冲
  • 一、python与pycharm的安装
  • 在Unity中实现一个简单的消息管理器
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ###项目技术发展史
  • $GOPATH/go.mod exists but should not goland
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (30)数组元素和与数字和的绝对差
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (不用互三)AI绘画工具应该如何选择
  • (第一天)包装对象、作用域、创建对象
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (十一)c52学习之旅-动态数码管
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (算法)大数的进制转换
  • (五)IO流之ByteArrayInput/OutputStream
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)项目管理杂谈-我所期望的新人
  • (转)重识new
  • (轉)JSON.stringify 语法实例讲解