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

相关推荐
cui_ruicheng8 小时前
MySQL(四):数据类型与字段设计
数据库·mysql
皮皮学姐分享-ppx8 小时前
政府绿色采购数据库(2015-2024.3)
大数据·网络·数据库·人工智能·制造
闪电悠米10 小时前
黑马点评-Redis 消息队列-03_stream_consumer_group
开发语言·数据库·redis·分布式·缓存·junit·lua
DIY源码阁11 小时前
JavaSwing航班订票管理系统 - MySQL版
数据库·mysql
qqxhb11 小时前
47|成本与性能:缓存、批处理、模型路由与降级
缓存·批处理·智能模型路由·多级降级预案·成本预算
浪客灿心12 小时前
项目篇:模块设计与实现
数据库·c++
佛祖让我来巡山13 小时前
线上 Redis 突然“爆”了,怎么办?
redis·redis宕机·redis崩了·redis线上事故
流星白龙13 小时前
【MySQL高阶】26.事务(1)
数据库·mysql
三十..14 小时前
Redis 核心原理与高可用架构实践
运维·数据库·redis
这个DBA有点耶14 小时前
索引优化深潜(下):索引合并、ICP 与索引设计的实战法则
数据库·mysql·架构