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

相关推荐
这个DBA有点耶1 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技1 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend2 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
ClouGence5 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
先吃饱再说1 天前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
Nturmoils1 天前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
Databend1 天前
Agent 轨迹分析与归因的数据工程实践
大数据·数据库·agent
这个DBA有点耶1 天前
SQL改写进阶:标量子查询的“隐形代价”与消除实战
数据库·mysql·架构
smallyoung1 天前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·mysql·postgresql
parade岁月1 天前
MySQL JOIN解析:朴实无华但食之有味
数据库·后端