【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的,随之调用对应的回调,进一步唤醒用户线程,来处理收到的数据。

相关推荐
悦数图数据库17 小时前
BOSS 直聘基于悦数图数据库构建智能根因定位平台的实践
数据库·人工智能
亮子AI17 小时前
【Node.js】为什么数据库连接总是中断?
数据库·node.js
DBA小马哥17 小时前
时序数据库在物联网中的应用
数据库·物联网·时序数据库
maray17 小时前
体验 Neon 产品
数据库·学习
亮子AI17 小时前
【MySQL】node.js 如何批量更新数据?
数据库·mysql·node.js
corpse201017 小时前
Transparent Huge Pages(透明大页)对redis的影响
linux·redis
xj75730653317 小时前
精通django 第二章 视图和URL
数据库·django·sqlite
摇滚侠18 小时前
两句话理解 ElasticSearch 搜索引擎数据库的作用
数据库·mysql·搜索引擎
BinaryBoss18 小时前
Python mongodb批量修改数据库某个字段
数据库·python·mongodb