API的理解和使用——单线程架构

news/2024/7/9 17:22:45 标签: 数据库, epoll, 数据结构与算法

核心知识点:

1.单线程机制:所有命令放在一个队列中

2.为什么Redis单线程这么快?内存中执行、非IO阻塞、避免线程切换和竞态产生的消耗。

3.单线程的问题?一个命令不能执行太长时间,不然会阻塞其他命令的执行。

 

Redis使用单线程架构和I/O多路复用模型来实现高性能的内存数据服务。

下面尝试说明Redis单线程命令处理机制,接着分析Redis单线程模型为什么性能如此之高。

1.单线程命令的处理机制

Redis客户端与服务端的模型可以简化成下图:

每次客户端调用都经历了发送命令、执行命令、返回结果三个过程。

 

因为Redis是单线程来处理命令,所以一条命令从客户端到达服务端不会立即被执行,所有的命令都会进入一个队列,然后逐个被执行。

所有即使是有先后顺序的几个命令到达服务端的执行顺序也是不确定的,因为中间有网络传输。

但是可以肯定的是,不会有两条命令被同时执行。

这样就不会产生并发问题,这就是Redis单线程的基本模型。

 

2.为什么单线程还能这么快?

通常来将,单线程的处理能力要比多线程差,因为10个人干活肯定要比1个人干活快。

那么为什么Redis使用单线程模型会达到每秒万级别的处理能力了?可以将其归结为三点:

第一,纯内存访问,Redis将所有数据放在内存中,内存的响应时长大约为100纳秒,这是Redis达到每秒万级别访问的重要基础。

第二,非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现,

  再加上Redis自身的事件处理模型将epoll中连接、读写、关闭都转换为事件,不在网络I/O上浪费过多时间。

第三,单线程避免了线程切换和竞态产生的消耗

 

既然单线程就能达到如此高的性能,那么也不失为一种不错的选择,因为单线程能带来几个好处:

首先,单线程可以简化数据结果和算法的实现。在高级语言中,并发数据结构不但实现很难而且开发测试比较麻烦。

其次,单线程避免了线程切换和竞态产生的消耗,对于服务端开发来所,锁和线程切换通常是性能杀手。

 

但是,单线程会有一个问题:对于每个命令的执行事件是有要求的。如果某个命令执行过长,会造成其他命令的阻塞,

对于Redis这种高性能的服务来说是致命的,所以Redis是面向快速执行场景的数据库

转载于:https://www.cnblogs.com/yangmingxianshen/p/8053548.html


http://www.niftyadmin.cn/n/1088884.html

相关文章

easyexcel 导出设置标题_又逼我写这么复杂样式的Excel导出功能?阿里P6:看我10行代码搞定...

正文开始前,分享阿里 P8 高级架构师吐血总结的 《Java 核心知识体系&面试资料.pdf》阿里 P8 级资深架构师吐血总结的一份 Java 核心知识.pdf, 内容覆盖很广,Java 核心基础、Java 多线程、高并发、Spring、微服务、Netty 与 RPC、Zookeeper、Kafka、R…

新松机器人BG总裁高峰_我校与沈阳新松机器人自动化股份有限公司签署“辽宁交专—新松机器人技术应用学院”企业捐赠协议...

王彤校长与张进副总裁签署捐赠协议9月11日,我校与沈阳新松机器人自动化股份有限公司共建“辽宁交专—新松机器人技术应用学院”企业捐赠签约仪式在学校行政办公楼317举行。沈阳新松机器人自动化股份有限公司副总裁张进及部分公司高管,我校校长王彤及校企…

FSMC_LCD

1. TFT-LCD(Thin Film Transistor Liquid Crystal Display)[薄膜晶体管液晶显示器] 2. 液晶 物质在熔融状态或在溶液状态下虽然获得了液体物质的流动性,但在材料内部仍然保留有分子排列的一维或二维有序,在物理性质上表现出各向异性。这种兼有晶体和液体…

CentOS 服务器部署 Hexo 博客并利用 Webhook 自动更新

Hexo, A fast, simple & powerful blog framework. 本地部署 Hexo 安装 根据 Hexo 官网的介绍, 首先要安装 Git 以及 Nodejs, CentOS 系统下直接 yum 安装即可: 12 yum install gityum install nodejs 两个工具都装好之后, 必要时设置 npm 的源: 12 npm config set proxy…

Ubuntu16.0.4配置python3.5和tensorflow

Ubuntu16.0.4配置python3.5和tensorflow#Ubuntu16.0.4系统自带的有python2.7的版本 #将python版本升为3.5 sudo apt-get install python3 #默认链接指向python3.5 sudo cp /usr/bin/python /usr/bin/python_bak #备份原来的链接 sudo rm /usr/bin/python #删除原来默认指向pyth…

一件代发系统php网站源码_php源码网站搭建方法和过程

web网站是我们上网的窗口,而网站是如何搭建的呢?今天我们来做一个介绍,以php代码为例来进行介绍(后续会介绍一下java代码搭建,如果想要我这里涉及的工具或源码请私信我)。1、首先你需要去网上下载你想搭建的源码。2、安装phpstudy…

存储ic载板_【热点】受益国产替代,I载板迎来历史性机遇

近期芯片产业链如何保持自主可控提到了前所未有的高度,由于中国芯片产业已出现了一大批掌握核心技术的骨干企业,例如上游设计的华为海思、中游芯片制造的中芯国际、下游封装的长电科技,在国际半导体产业不断向大陆转移的过程,IC载…

golang-Beego-orm创建的坑

Orm使用sqlites不识别问题 Idc string description:"机房"这个description sqlites的数据库不识别.解决方法 去掉description golang下载国内镜像 使用golang经常出现很多包都无法下载,导致整个项目无法使用. gopm 代替go 下载第三方依赖包 可以采用gopm从golan…