Java面试题:Redis为什么速度快

Redis为什么速度快

Redis是纯内存操作

采用单线程,避免不必要的上下文切换可竞争条件
多线程还要考虑线程的安全问题
使用I/O多路复用模型,非阻塞IO

I/O多路复用模型

因为Redis是纯内存操作,执行速度非常快,性能的瓶颈是网络延迟而非执行速度

I/O多路复用模型主要就是实现了高效的网络请求

用户空间和内核空间

用户空间只能执行受限的命令(Ring3),权限较低

不能直接调用系统资源必须通过内核提供的接口来访问

内核空间可以执行特权命令(Ring0),调用一切系统资源

Linux系统为了提高IO效率,会在用户空间和内核空间都加入缓冲区

写数据时,要把用户缓存数据拷贝到内核缓存区,然后写入设备

读数据时,要从设备读取数据到内核缓冲区,然后拷贝到用户缓存区

常见的IO模型
阻塞IO(BIO)

阻塞IO就是在两个阶段中都需要阻塞等待

1:用户进程尝试读取数据的阶段

2:数据到达内核缓冲区拷贝到用户缓存区的阶段

非阻塞IO(NIO)

非阻塞IO在用户进程尝试读取数据的阶段中

如果数据尚未到达,不会阻塞等待而是返回异常给用户进程

用户进程获取异常后会循环尝试读取直到数据就绪

在内核数据拷贝到用户缓冲区的过程中

用户进程依然是阻塞等待的状态直到拷贝完成

IO多路复用(IO Multiplexing)

利用单个线程同时监听多个socket,在某个socket可读,可写时得到通知,避免无效的等待,充分利用CPU资源

阶段一:用户进程调用select指定要监听的socket集合,内核监听对应的多个socket,任意一个或多个socket就绪就返回readable

在这个过程中用户进程阻塞

阶段二:用户进程找到就绪的socket,依次调用recvfrom读取数据

内核将数据拷贝到用户空间

用户进程处理数据

linux中实现IO多路复用的方式

select,poll:轮询socket确认哪个socket就绪

epoll:通知用户socket就绪的同时把已就绪的socket写入用户空间
Redis网络模型

基于IO多路复用进行监听

监听每个客户端socket的连接(仅监听就绪的socket事件)

将这些事件派发给不同的处理器

连接应答处理器
命令回复处理器
命令请求处理器

在redis6.0之后引入了多线程模型

主要提高的是网络性能读取性能

在命令解析的部分,多线程解析命令转为redis操作(网络操作)

执行命令仍然使用单线程串行执行(线程安全)

执行结果会存入缓冲队列,从缓冲区输出响应结果时也需要使用多线程(网络操作)

即响应客户端部分

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

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

相关文章

全球视角下的网络安全法规

在全球范围内,网络安全法规的发展已成为各国政府关注的焦点。随着互联网的快速发展和信息技术的广泛应用,网络安全问题日益凸显,为此,各国纷纷出台了相应的网络安全法律法规,以应对不断演变的网络威胁并维护网络空间的…

Fusion WAN:企业出海与全球组网的数字网络底座

众多中国企业与品牌正将目光投向海外市场,积极寻求发展新机遇,并且在这一过程中取得了显著的成果。"出海"战略已经成为一些企业转型升级的关键选择。 随着国内市场的竞争日益激烈,越来越多的企业开始寻求海外市场的拓展&#xff0c…

@NestedConfigurationProperty注解嵌入配置类不生效

问题 在SmsProperties中嵌入AliyunSmsProperties,在代码中通过SmsProperties读取AliyunSmsProperties的配置为null导致无法启动。两个配置类如下: Data ConfigurationProperties(prefix "sms") public class SmsProperties {NestedConfigur…

11年之约 聚焦上海 | 亚信科技邀您相约2024 MWC上海展

关于亚信安慧AntDB数据库 AntDB数据库始于2008年,在运营商的核心系统上,服务国内24个省市自治区的数亿用户,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔通信核心交易,保障系统持续稳定运行超十年&a…

深入理解PHP命名空间

在PHP项目中,命名空间(namespace)是一个非常重要的特性。它不仅帮助开发者组织代码,还能避免类、函数、常量等命名冲突问题。本文将详细介绍PHP命名空间的概念、使用方法和最佳实践。 一、什么是命名空间? 命名空间…

淘客返利平台的前端架构与优化

淘客返利平台的前端架构与优化 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在当前互联网时代,淘客返利平台已经成为电商生态的重要组成部分。为…

windows@局域网或蓝牙文件传输@共享文件夹@就近共享

文章目录 windows系统下的简单共享文件方案👺就近共享设置共享文件夹(推荐)方法1:使用shrpubw程序引导创建方法2:使用图形界面创建右键设置共享文件夹 查看所有已经共享的文件夹👺停止某个文件的共享 共享文件夹的访问控制补充匿名访问问题😊…

10个国内免费AI绘画网站汇总【2024最新】

迎战MidJourney和Stable Diffusion:10款国产AI绘画神器,让你轻松创作出超凡艺术品!不论你是初学者还是资深艺术家,这些AI绘画平台都能帮你轻松入门。快来探索这些AI绘画网站,释放你的创意潜能! 1、AI绘画创…

MapStruct参数拷贝

我们先看看前面的部分代码 Override public UserDto getUserById(Integer userId) {User user userDaoService.getById(userId);UserDto userDto new UserDto();BeanUtils.copyProperties(user, userDto);return userDto; } 我们上面代码里面可以看到,处理参数和…

【Android】AppCompatSeekBar只扩大触摸区域而外观不变

实现方案&#xff1a; 首先&#xff0c;SeekBar布局如下&#xff0c;不直接调整SeekBar的尺寸&#xff0c;而是为其添加一个包裹的FrameLayout作为透明覆盖层。 <FrameLayoutandroid:id"id/touch_overlay"android:layout_width"wrap_content" <!--…

flex属性中的flex-grow、flex-shrink、flex-basis

flex-grow 属性 flex-grow 属性用于设置或检索弹性盒子的扩展比率。 默认值为0&#xff0c;表示不伸展。 flex-grow属性值为0时&#xff0c;不伸展&#xff1a; <!doctype html> <html lang"en"><head><style>.d-flex {display: flex;width…

python学习 - 设计模式 - 组合模式

组合模式 Composite , 将对象组组合成树形结构以表示’部分-整体’ 的层次结构.组合模式使得用户对单个对象的组合对象的使用具有一致性 #!/usr/bin/python # -*- coding:UTF-8 -*- # File : d1.py # Software: PyCharm""" 组合模式 Composite , 将对象组组…

C语言——链表专题

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 点击主页&#xff1a;optimistic_chen和专栏&#xff1a;c语言&#xff0c; 创作不易&#xff0c;大佬们点赞鼓…

IP地址定位技术的广泛应用

IP地址定位技术是一种通过分析网络设备所使用的IP地址来确定其地理位置的地址技术手段。 IP地址定位技术基于互联网服务提供商&#xff08;ISP&#xff09;所分配的IP地址范围以及相关的地理信息数据库。当一个设备连接到网络并使用特定的IP地址进行通信时&#xff0c;IP地址定…

mac安装opencv并在vscode中配置c++环境调试推理YOLOv8网络模型

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。它支持多平台(包括 Windows、Linux、macOS)和多种编程语言(如 C++、Python、Java),使其成为研究、开发和部署计算机视觉应用的重要工具之一。 步骤 1: 创…

上海慢病管理app开发的意义及功能

近年来&#xff0c;随着经济与科技的不断发展&#xff0c;人们对慢性疾病的重视程度也不断提高。大家不再满足于周期较长的定期检查&#xff0c;而是渴求能够进行短期、实时的病情预防与监测&#xff0c;为了满足人们的需求&#xff0c;帮助大家更好的干预病情&#xff0c;上海…

Linux内核 -- 汇编结合ko案例之PMU获取周期技术

ARMv7汇编实现周期计数读取与清空 本文档详细描述了如何在ARMv7平台上使用汇编语言编写周期计数器读取与清空函数&#xff0c;如何在内核模块中导出这些函数供其他模块调用&#xff0c;以及如何使用Netlink接口供用户态程序进行调用。 1. 汇编函数实现 首先&#xff0c;编写…

Java OA系统邮件管理模块

## 使用Spring Boot和Hibernate开发OA系统邮件管理模块 使用Spring Boot和Hibernate开发一个OA系统的邮件管理模块。该模块将支持邮件发送、接收、存储、查找、分类、标签管理&#xff0c;以及附件的上传和接收。前端部分使用Thymeleaf模板引擎&#xff0c;数据库选择MySQL。 …

AI智能体的炒作与现实:GPT-4都撑不起,现实任务成功率不到15%

AI 智能体的宣传很好&#xff0c;现实不太妙。 随着大语言模型的不断进化与自我革新&#xff0c;性能、准确度、稳定性都有了大幅的提升&#xff0c;这已经被各个基准问题集验证过了。 但是&#xff0c;对于现有版本的 LLM 来说&#xff0c;它们的综合能力似乎并不能完全支撑得…

from PyQt5.QtChart import QChart ImportError: DLL load failed: 找不到指定的模块。

最近在开发pyqt5代码 在运行是遇到from PyQt5.QtChart import QChart ImportError: DLL load failed: 找不到指定的模块。问题&#xff0c; 估计是安装QChart安装没正确&#xff0c;可以更新下安装包&#xff0c; pip install PyQt5 --upgrade pip install PyQtChart --upgrade…