Redis 为何如此之快: 深入解析其高性能背后的秘密 (个人分析,仅参考)

问题描述

Redis 和 MySQL 一个是非关系型数据库,一个是关系型数据库。在很多并发式项目中,MySQL一般是作为主数据库来使用,Redis 起到缓存的作用,相比 MySQL ,Oracle , SQL server 它的储存速率极为惊人。因为快的这个特性,全球很多重量级的公司都在使用Redis,所以,可以这么说,熟练使⽤和运维 Redis 已经成为开发运维⼈员的⼀个必备技能。

那么光顾着学,有个问题,Redis 为什么这么快?


原因分析:

1. 内存中的数据存储

Redis 的所有数据都存储在内存中,这是其快速响应的主要原因。而 MySQL 数据库的数据存储在硬盘中,有计算机基础知识的人应该都知道,内存的访问速度比磁盘的访问速度快几个数量级!!

根据谷歌公司2009年发布的硬件执行速度层级表(见表1-1),内存访问速度远超磁盘I/O。因此,将数据直接存放在内存中极大地减少了数据读取和写入时的延迟。

硬件组件速度 (ns)
寄存器0.5
L1缓存1
L2缓存7
主内存100
磁盘10,000,000

从上表可以看出,主内存的访问速度是磁盘的数百万倍,这解释了为什么基于内存的数据库能够提供极高的性能。


2. 简单的功能设计

Redis 的简洁性

Redis 的设计目标是简单而高效。它主要提供了一些基本的数据结构,如字符串、列表、集合等,并且操作这些数据结构的命令也非常直接。这种简洁的设计减少了不必要的复杂性,使得 Redis 能够更快地处理请求。

数据库的多功能

与 Redis 不同,传统数据库如 MySQL 提供了更多的功能,包括复杂的查询、触发器、视图等。这些功能虽然增强了数据库的能力,但也带来了更多的开销。例如,插入或删除数据时,数据库可能需要进行多次检查和更新,这会增加处理时间。


3. 单线程模型

避免竞争

Redis 使用单线程来处理客户端请求。这种方式避免了多线程环境下的许多问题,比如线程之间的竞争和上下文切换。由于 Redis 的操作通常是简单的内存操作,单线程模型已经足够高效。

简单操作

每个 Redis 命令通常都非常简单,不需要复杂的计算。因此,单线程模型足以应对大多数情况,并且能够保持系统的简洁和高效。


4. I/O 多路复用技术

epoll 的优势

Redis 在处理网络连接时使用了一种叫做 epoll 的技术(在 Linux 上)。epoll 允许一个线程同时管理多个网络连接。这意味着一个线程可以同时处理大量的客户端请求,而不会因为等待某个特定连接的数据传输而阻塞。

传统的多线程服务器

在传统的 TCP 服务器实现中,每接受一个新的客户端连接,服务器就需要为其分配一个新的线程。这种方法在客户端数量较少时是可行的,但随着客户端数量的增长,系统开销也会急剧增加。每个线程都需要占用一定的内存资源,并且线程之间的切换也会带来额外的开销。

低效的资源利用

实际上,在很多情况下,客户端和服务器之间的通信并不频繁。大部分时间里,许多网络连接都是静默的,没有数据传输。如果为每个客户端都分配一个线程,会导致大量的资源浪费。而通过 epoll 技术,Redis 可以高效地管理这些连接,仅在有数据需要处理时才进行相应的操作。


结论

总的来说,Redis 的高性能主要得益于以下几个方面:

  • 数据存储在内存中,访问速度快。
  • 功能设计简单,专注于基本的数据结构操作。
  • 使用单线程模型,避免了多线程带来的复杂性。
  • 利用 I/O 多路复用技术,高效管理大量网络连接。

这些设计选择使得 Redis 成为处理高并发请求和实时数据操作的理想选择。

以上就是今天的内容咯,我学夺少,给兄弟们分享夺少   感谢阅览 !

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

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

相关文章

C++类之set与get理解

在类中,我们尝尝将一些变量设置为private或者protect里面,而我们经常会遇到在主函数(main.cpp)使用到这些private变量,而往往我们会下意识地在主函数直接调用在private里面的变量,但现实比较残酷&#xff0…

【linux】nice命令

Linux中的nice命令是一个强大的工具,用于调整进程的优先级,进而影响它们在CPU上的资源分配和执行顺序。以下是关于nice命令的详细解释,包括其用途、语法、参数、示例以及使用建议。 一、用途 nice命令主要用于控制进程在CPU上的调度优先级&…

K8S介绍+集群部署

Kubernetes介绍 官网:https://kubernetes.io/ 一、应用部署方式演变 1、传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其他技术的参与 缺点:不能为应用程序定义资源使用边界&a…

【论文笔记】BEVNeXt: Reviving Dense BEV Frameworks for 3D Object Detection

原文链接:https://arxiv.org/pdf/2312.01696 简介:最近,在摄像头3D目标检测任务中,基于查询的Transformer解码器正在超越传统密集BEV方法。但密集BEV框架有着更好的深度估计和目标定位能力,能全面精确地描绘3D场景。本…

初始网络编程(下)

所属专栏:Java学习 1. TCP 的简单示例 同时,由于 TCP 是面向字节流的传输,所以说传输的基本单位是字节,接受发送都是使用的字节流 方法签名 方法说明 Socket accept() 开始监听指定端口(创建时绑定的端口&…

Navicat导入Sql文件至Mysql数据库,事务失效

Mysql 版本:8.0.39 Navicat 版本:17.x、16.x 结论: Navicat 导入sql文件,事务不会生效,无论怎么设置 mysql.exe 导入sql文件,事务生效 测试 准备一张表 name约束不能为空,用于测试事务失败…

SpringBoot 整合 Caffeine 实现本地缓存

目录 1、Caffeine 简介1.1、Caffeine 简介1.2、对比 Guava cache 的性能主要优化项1.3、常见的缓存淘汰算法1.4、SpringBoot 集成 Caffeine 两种方式 2、SpringBoot 集成 Caffeine 方式一2.1、缓存加载策略2.1.1、手动加载2.1.2、自动加载【Loading Cache】2.1.3、异步加载【As…

7、论等保的必要性

数据来源:7.论等保的必要性_哔哩哔哩_bilibili 等级保护必要性 降低信息安全风险 等级保护旨在降低信息安全风险,提高信息系统的安全防护能力。 风险发现与整改 开展等级保护的最重要原因是通过测评工作,发现单位系统内外部的安全风险和脆弱…

Linux启动流程,0,1,2进程,init进程,idle进程,内核态到用户态的kernel_execve(一)

?是,如果定义了,就按Makefile的,如果如下make编译时,就按如下 linux内核入口 进程0在用户空间看不到,因为他是内核进程 进程2就是守护进程,维护内涵运转的 一生二,二生三&#xff…

Navicate 链接Oracle 提示 Oracle Library is not loaded ,账号密码都正确地址端口也对

Navicate 链接Oracle 提示 Oracle Library is not loaded ,账号密码都正确地址端口也对的问题 解决办法 出现 Oracle Library is not loaded 错误提示,通常是因为 Navicat 无法找到或加载 Oracle 客户端库(OCI.dll)。要解决这个问题&#x…

IntelliJ IDEA 2024.1.4 (Ultimate Edition)找不到Add Framework Support解决方法

目录 背景: 解决方法: 步骤1: 步骤2: 步骤3: 创建Web项目的完整流程: 步骤1: 步骤2: 步骤3: 步骤4: Web优点: 背景: 我的IDE版本是IntelliJ IDEA 2024.1.4 (Ultimate Edition),当我…

Java调用数据库 笔记05(查询篇)

一. 数据库(通过各种驱动来实现调用): (应用程序通过接口控制的各种数据库驱动来调用数据库-->jdbc方法) 1.创建Java的普通class类 2.加载驱动 Class.forName("com.mysql.jdbc.Driver"); 3.驱动管理类…

nginx upstream转发连接错误情况研究

本次测试用到3台服务器: 192.168.10.115:转发服务器A 192.168.10.209:upstream下服务器1 192.168.10.210:upstream下服务器2 1台客户端:192.168.10.112 服务器A中nginx主要配置如下: log_format main…

C++之职工管理系统(细节Q)

指针初始化类 && 普通变量初始化类 抽象基类worker,只需编写 .h ,无需 .cpp 底层实现 类 记得声明权限public!!!不然默认private,主函数访问不了 记得继承父类 Worker * worker:指向Wo…

山东潍坊戴尔存储服务器维修 md3800f raid恢复

山东戴尔存储故障维修 存储型号:DELL PowerVault md3800f 故障问题:存储除尘后通电开机,发现有物理硬盘没有插到位,用户带电拔插了多块物理盘,导致关连的磁盘阵列掉线,卷失败; 处理方式&#xf…

RK3588/RK3588s运行yolov8达到27ms

前言 Hello,小伙伴们~~我最近做了一个比较有意思的东西,想起来也好久没有写博客了,就记录一下吧。希望和大家一起学习,一起进步! 我简单介绍一下我最近做的这个东西的经过哈~上个月在B站上看到了一个博主发了一条视频关…

TomCat乱码问题

TomCat控制台乱码问题 乱码问题解决: 响应乱码问题 向客户端响应数据: package Servlet;import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servl…

对 Python 中 GIL 的理解

一.Python 中的 GIL Python 中的全局解释器锁(Global Interpreter Lock,GIL)是 CPython 解释器的一个机制,用来确保在多线程环境下,只有一个线程可以执行 Python 字节码,任何时刻只能有一个线程在执行 Pyt…

低代码可视化工具-uniapp页面跳转传参-代码生成器

uniapp页面跳转传参 在uni-app中,页面间的跳转和传参是一个常见的需求。uni-app提供了多种页面跳转方式,如uni.navigateTo、uni.redirectTo、uni.reLaunch、uni.switchTab、uni.navigateBack等,每种方式适用于不同的场景。以 页面跳转并传参…

win7自带壁纸丢失主题丢失

有时候盗版破解或者其他美化工具会导致win7自带的壁纸丢失,从个性化管理里面无法恢复原始的壁纸(如下图),但是由于工作原因公司的电脑又不方便设置第三方的壁纸,所以找了一下解决方案。 经典问题,百度找到的…