Redis(二) 单线程架构

news2024/9/20 2:41:31

在这里插入图片描述

redis 的单线程架构

我们都知道 redis 作为缓存,读取速度是非常快的,但是大家知道 redis 的线程架构是怎样的呢?也就是说,redis 是多线程架构还是单线程架构呢?
我们通过一个例子来了解:

首先在 redis 服务器中设置一个 key-value:

127.0.0.1:6379> set hello world

然后分别在两个客户端中同时向 redis 服务器发送请求:

127.0.0.1:6379> incr counter

incr 命令就相当于是 +1 操作,类似前置 ++ 或者后置 ++,我们都知道进行 ++ 操作大致分为三个步骤:从内存中读取变量的值 -> 对变量进行 +1 操作 -> 将修改之后的变量再存储到内存中,但是这三个操作不是原子性操作,也就是说,当多个线程同时对一个相同的变量进行 ++ 操作的时候可能会发生线程不安全的问题。但是在我们的 redis 中不会发生这种问题,因为我们的 redis 服务器的线程架构是单线程架构。

这时有人就会问了,redis 服务器时刻接收上万甚至更多的请求,使用多线程架构不是更快一些吗?是的,对于我们其他的服务来说,使用多线程架构来处理请求速度是由于单线程架构的,但是对于我们的 redis 来说,可能单线程架构才是最优的选择。

为什么这样说呢?我们都知道 redis 作为缓存,读取操作数据都是在内存中的,相较于 MySQL 数据库操作数据是在硬盘中的速度快了上千倍甚至上万倍,也就是 redis I / O 的速度是远快于 MySQL 的,不仅如此,redis 的命令执行速度也是小而快的,不像 MySQL 那样有什么唯一约束什么的,redis 的命令执行速度也是很快的,redis 处理每个请求所占用的时间都是非常短的,所以使用多线程对于速度的提升并不明显,更准确的来说,redis 使用多线程可能还会降低服务器处理请求的速度,因为多线程涉及到线程安全的问题,所以就需要考虑到线程竞争和加锁解锁的问题,这些都是需要消耗时间的,综合上面的原因,所以 redis 选择了使用单线程的架构。

宏观上,redis 服务器同时接收多个客户端发送的请求:

在这里插入图片描述

但是微观上客户端发送命令的时间是有先后顺序的:

在这里插入图片描述
这种先后次序可能是网路传输速度不同导致的,虽然我多个客户端同时向 redis 服务器发送请求,但是由于网络传输速度不同,导致请求到达 redis 服务器的时间不同,即使这几个客户端的网络传输速度是相同的,redis 服务器同时接收到这几个客户端发送过来的请求,redis 服务器也不会同时处理这些请求,而是根据某种标准对这些请求进行排序,然后一次执行这些请求。

在这里插入图片描述

为什么单线程结构还能那么快?

通常来说,单线程的处理能力要比多线程差,但是为什么 redis 的单线程模型能达到每秒万级别的处理能力呢?有以下原因:

  1. 纯内存访问。Redis 将所有的数据放在内存中,内存的响应时间大约为 100 纳秒,这是 Redis 能达到每秒万级别的重要基础。
  2. 非阻塞 IO。redis 使用 epoll 作为 I/O 多路复用技术的实现,再加上 Redis 自身的事件处理模型将 epoll 中的连接、读写、关闭都转换为事件,不在网络 I/O 上浪费过多的时间,如下图所示:
  3. 单线程避免了线程切换和竞态产生的消耗。单线程可以简化数据结构和算法的实现,让程序模型更简单;其次多线程避免了在线程竞争同⼀份共享数据时带来的切换和等待消耗。

在这里插入图片描述

虽然 redis 使用单线程架构是优于多线程架构的,但是我们需要知道 redis 为什么会选择单线程以及单线程的弊端:那就是单个命令执行所用的时间不易过长,就像我们前面使用 keys 命令的时候,应尽量避免 keys * 的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1612093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Web的宠物医院信息管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本宠物医院信息管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据…

【C++】explicit关键字详解(explicit关键字是什么? 为什么需要explicit关键字? 如何使用explicit 关键字)

目录 一、前言 二、explicit关键字是什么? 三、构造函数还具有类型转换的作用 🍎单参构造函数 ✨引出 explicit 关键字 🍍多参构造函数 ✨为什么需要explicit关键字? ✨怎么使用explicit关键字? 四、总结 五…

MariaDB InnoDB 空洞清理

1、背景 数据库占用服务器内存越来越高,除了bin-log文件之外,还发现了一些带有text或者longtext数据类型字段的表,这种表也会占用很高的服务器磁盘空间 数据库版本: 表引擎: InnoDB 数据量:清理之前1500万…

python安装的详细步骤

下载 1.打开Python官网.我们建议工具类的测试软件还是官网下载比较靠谱. https://www.python.org/getit/ 2.在下图界面中选择需要的方式进行点击 3.直接点击下载.可以进入保存界面,进行保存即可下载,后续安装 4.鼠标放在Downloads显示平台和版本选择界面,点击Windows,进入wi…

【备战算法岗】—— 控制模块复习(持续更新!!!)

1 控制理论基础 1.1 控制模块概述 输入:轨迹线Reference、地图信息、定位信息、车辆反馈信息 输出:刹车、油门、转向 CANBUS:车辆底盘交互协议 参考博客:Apollo CANBUS模块解析 apollo:canbus模块(1&…

【超萌二次元动漫个人主页HTML源码】

效果图 部分代码 index.htnl <!DOCTYPE HTML> <html> <head> <title>个人主页介绍页</title> <meta name"keywords" content"孤客个人主页介绍页"> <meta name"description" content"孤客个…

曲线救国|基于函数计算FC3.0部署AI数字绘画stable-diffusion

曲线救国|基于函数计算FC3.0部署AI数字绘画stable-diffusion 基于函数计算FC2.0部署AI数字绘画stable-diffusion基于函数计算FC3.0部署AI数字绘画stable-diffusion总结 在经过了上一次曲线救国失败经历之后&#xff0c;失败经历参考博文&#xff1a;https://developer.aliyun.c…

PF滤波?

粒子滤波 本文是对于原文的学习与部分的转载 https://blog.csdn.net/weixin_44044161/article/details/125445579 粒子滤波是在目标跟踪中常用的一种方法 非线性条件下&#xff0c;贝叶斯滤波面临一个重要的问题是状态分布的表达与积分式的求解 由前面章节中的分析可以得知…

Jupyter的下载与安装

1.下载&#xff1a; 在anaconda的指定环境中 conda install nb_conda_kernels 2.打开 在anaconda指定环境中使用命令&#xff1a; jupyter notebook 3.输入指令后&#xff0c;会显示如下&#xff0c;根据显示地址打开 3. 在右边的new按钮处&#xff0c;选择相应环境&…

C++参考手册使用说明

C参考手册使用说明 文章目录 C参考手册使用说明1 为什么要使用C参考手册2 网站3 C参考手册离线格式4 C参考手册使用说明1.1 离线C参考手册下载1.2 html离线C参考手册1.3 chm离线C参考手册1.4 linux安装包C参考手册&#xff08;只有英文版本&#xff09;1.5 qch离线C参考手册 更…

oracle操作系统OS认证和密码文件认证

1 说明 1.1 常见认证方式 Oracle登录认证方式主要涉及到如何验证用户身份以访问数据库。Oracle数据库提供了多种认证机制来确保数据的安全性和访问控制&#xff0c;每种方式都有其特定的使用场景和安全性考虑。以下是Oracle中常见的登录认证方式&#xff1a; 1、基于操作系统…

【从浅学到熟知Linux】基础IO第一弹=>C语言文件操作接口、文件系统调用、文件描述符概念及分配规则

&#x1f3e0;关于专栏&#xff1a;Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 C语言文件接口回顾系统文件概念与接口文件基本概念系统接口openreadwritecloselseek 什么是当前路径 文件描…

CTFHUB RCE作业

题目地址&#xff1a;CTFHub 完成情况如图&#xff1a; 知识点&#xff1a; preg_match_all 函数 正则匹配函数 int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags PREG_PATTERN_ORDER [, int $offset 0 ]]] )搜索 subject 中…

Navicat Premium 16最新版激活 mac/win

Navicat Premium 16 for Mac是一款专业的多连接数据库管理工具。它支持连接多种类型的数据库&#xff0c;包括MySQL、MongoDB、Oracle、SQLite、SQL Server、PostgreSQL等&#xff0c;可以同时连接多种数据库&#xff0c;帮助用户轻松地管理和迁移数据。 Navicat Premium 16 fo…

如何在在wordpress安装百度统计

前言 看过我的往期文章的都知道&#xff0c;我又建了一个网站&#xff0c;这次是来真的了。于是&#xff0c;最近在查阅资料时发现&#xff0c;有一款免费的软件可以帮我吗分析网站数据。&#xff08;虽然我的破烂网站压根没人访问&#xff0c;但是能装上的都得上&#xff0c;…

【离散数学】关系

一、序偶和笛卡尔积 序偶&#xff1a;两个元素按照一定的次序组成的二元组&#xff0c;记为<x,y>&#xff0c;x为第一元素&#xff0c;y为第二元素 序偶的相等条件&#xff1a;<a,b><c,d>当且仅当ac,bd n重有序组&#xff1a;n个元素按照一定次序组成的n元…

CSS——前端笔记

CSS 1、选择器1.1、基础选择器1.2、复合选择器1.2.4、伪类选择器 1.3、属性选择器1.4、结构伪类选择器1.5、伪元素选择器 2、CSS的元素显示模式2.1、块元素2.2、行内元素2.3、行内块元素2.4、元素显示模式转换 3、字体属性3.1、font-family 字体3.2、font-size 字体大小3.3、fo…

Python 数据结构和算法实用指南(四)

原文&#xff1a;zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十二章&#xff1a;字符串算法和技术 根据所解决的问题&#xff0c;有许多流行的字符串处理算法。然而&#xff0c;最重要、最流行和最有…

c语言之字符串的集合存放形式

采用指针分配的二维数组与直接定义的二维数组&#xff0c;sizeof的不同 采用指针分配的二维数组&#xff1a; 它的遍历方式是&#xff1a; 上面这个是分配二级指针的地址&#xff0c;二级指针就是一片可以用来分配一级指针空间的地址&#xff0c;然后指针寻址本来就可以当成数组…

Mac多媒体播放器 Movist Pro v2.11.4中文激活版下载

Movist Pro for Mac是一款专业的媒体播放器&#xff0c;特别为Mac用户设计。它不仅界面简洁美观&#xff0c;而且功能强大&#xff0c;能满足用户各种播放需求。 Movist Pro v2.11.4中文激活版下载 首先&#xff0c;Movist Pro for Mac支持多种媒体文件的播放&#xff0c;包括视…