【Redis】-- 单线程模型

单线程模型

  • [1. redis单线程模型的原理](#1. redis单线程模型的原理)
  • [2. redis单线程为什么快?(常见面试题)](#2. redis单线程为什么快?(常见面试题))

1. redis单线程模型的原理

redis 只使用一个线程来处理所有的命令请求,微观上来讲,redis服务器是串行/顺序执行多个命令的。并不是说一个redis服务器内部真的只有一个线程,redis服务器内部的多个线程是在处理网络IO。

redis并不会出现多线程中 两个线程尝试同时对一个变量进行自增操作,表面上是进行了两次自增,结果却是自增一次的结果 的问题。

redis之所以使用单线程模型可以很好的工作,主要原因是在于redis的核心业务逻辑都是扁平快的,不太消耗cpu资源,自然就不太吃多核了。

但是如果redis中的某个操作占用时间长,就会阻塞其他命令的执行。

2. redis单线程为什么快?(常见面试题)

之所以说redis单线程快、效率高是和数据库(MySQL、sql Server、oracle)做对比的。

1) redis是访问的内存;数据库是访问硬盘的。

2) redis核心功能比数据库核心功能更简单。

数据库对于数据的插入、删除、查询等操作都用更复杂的功能支持,这样的功能支持势必有更多的开销。比如,针对插入、删除,数据库中的各种约束都会使数据库做更多额外的工作。

3)redis采取的是单线程模型,避免了一些不必要的线程竞争开销。

redis的每个操作都是短平快的,只是简单的操作一下内存数据,并不怎么消耗cpu,就算使用多线程,提升也不大。

4)redis在处理网络IO的时候,使用了epoll这样的IO多路复用机制。

IO多路复用:一个线程,可以管理多个socket。是操作系统给程序猿提供的一套API,内部的功能都是操作系统内核实现的。Linux上提供的IO多路复用,只要是三套API:select、poll、epoll。

epoll是目前最高效的版本,是一种事件通知/回调机制,C++可以使用Linux原生的epoll API;Java可以使用NIO,NIO是标准库提供的一组类,底层就是封装了epoll。

针对TCP来说,服务器每服务一个客户端,就要给对应的客户端安排一个socket,一个服务器要服务多个客户端,那么就同时有很多个socket。

但是在很多情况下,每个客户端和服务器之间的通信并没有那么频繁(同一时刻,只有少数的socket是活跃的)。

epoll在内核中维护了一个红黑树,来管理所有的socket,并且每个节点都关联了一个事件回调。当系统内核感知到网卡收到数据了,会进一步判定这个数据是给那个socket的,随之调用对应的回调,进一步唤醒用户线程,来处理收到的数据。

相关推荐
坚定信念,勇往无前2 分钟前
electron-vite 安装better-sqlite3
javascript·数据库·electron
大明者省7 分钟前
Ubuntu22.04 宝塔面板与 XFCE 远程桌面端口兼容性分析
运维·服务器·数据库·笔记
1892280486130 分钟前
NY379固态MT29F32T08GSLBHL8-36QA:B
大数据·服务器·人工智能·科技·缓存
liudanzhengxi32 分钟前
巧用ULN2003A轻松扩展单片机IO口
数据库·mongodb
Teable任意门互动40 分钟前
深度解析:AI 赋能开源多维表格,实现企业全场景数据整合与高效应用
数据库·人工智能·低代码·信息可视化·开源·数据库开发
牧羊狼的狼1 小时前
高并发会带来哪些问题,如何解决?
缓存·高并发
无小道1 小时前
Redis——哈希类型相关指令
redis·算法·哈希算法
DevOpenClub1 小时前
职教高考及高职分类招生控制线 API 接口
java·数据库·高考
funnycoffee1231 小时前
华为S5736交换机3层ECMP负载方式
linux·服务器·数据库