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

相关推荐
haixingtianxinghai1 小时前
Redis的定期删除和惰性删除
数据库·redis·缓存
资深web全栈开发1 小时前
PostgreSQL Schema 最佳实践:架构师的命名与组织艺术
数据库·postgresql
麦聪聊数据2 小时前
利用实时数据管道与 SQL2API 重构企业自动化审计架构
数据库·sql·低代码
麦聪聊数据2 小时前
重构开放生态:利用 QuickAPI 跨越遗留系统与敏捷交付的工程实践
数据库·sql·低代码·restful
百结2147 小时前
Mysql数据库操作
数据库·mysql·oracle
keep one's resolveY7 小时前
时区问题解决
数据库
Leinwin7 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
qq_417695057 小时前
机器学习与人工智能
jvm·数据库·python
漫随流水7 小时前
旅游推荐系统(view.py)
前端·数据库·python·旅游
ego.iblacat7 小时前
MySQL 服务基础
数据库·mysql