mysql和redis的区别

一.额外知识 

1.为什么内存读取比硬盘读取快

在了解mysql和redis的区别之前,先来讨论一下额外的知识:为什么内存读取比硬盘读取快?

先看一个结论:内存读取至少比硬盘读取快10万倍

首先机械硬盘基本上的速度都在100MB-200MB 之间,SSD硬盘快一点,但是也是在500MB左右的水准,但是现在DDR4内存基本上都是50GB-100GB之间看频率,那这是为什么呢:拿机械硬盘举例,如果cpu要到硬盘里面去拿数据,它得走 I/O,然后机械硬盘还得转着找资源,找到了之后把数据写到内存,然后cpu才去内存里面读.

但是cpu如果要的数据在内存里面呢?它先读一级缓存,然后二级缓存,然后三级缓存,最后到内存里面去找,虽然它得走四步,硬盘读取也只比它多了两步调用,但是一级缓存的速度那基本上都是 1000G/s, 这三个缓存用的时间和硬盘读取的时间根本不是一回事儿,差距太大了

了解了为什么内存读取比硬盘读取快,再来看看为什么数据库比硬盘快?

2.为什么数据库比硬盘快

磁盘读取的话有磁道和扇区的一个概念,一个扇区是512byte, 然后每次读东西的时候都是 512byte往外拿,就算只读一个字节的东西一样会给512 ,这个和缓存行的概念是一样的

但是后来硬盘变大了,操作系统定义了一个4K对齐原则:就是每次读取4k,为什么要这样弄呢,因为硬盘大了放的东西就多了,比如:

如果一个学校里面有2000个学生
那么给学号的话是不是只需要4位数就能表示哪个学号是哪个学生了
但是如果有2000000个学生了呢?4位数的学号就不够用了,就得扩大位数
以前512byte的时候,索引4个字节就能搞定了,
但是现在硬盘变大了东西变多了4个字节搞不定了,要么就减少存储空间,
要么就扩大每次读取的数量

4k对齐解决了存储问题,但并没有解决读取速度的问题,因为是有带宽限制的,所以就出现了 SSD硬盘,它比传统的机械硬盘更好,具有快速读写、质量轻、能耗低以及体积小等优点.

4K对齐之后全量IO速度比一开始也快不了多少,那想让读取速度变快的关键在于解决全量 IO 的问题

如果一个盘里面放了一千个文档,想要找到其中的一个文档这很困难,
那如果用一百个文件夹去分类,每个文件夹里面只放部分相似的文档,
比如说Redis的文件夹就放Redis的文档,这样找文档的效率就大大提升了,
同理如果后面文档数量又变大了,变成了100W个那就可以采用文件夹套文件夹的方式去解决

可以理解将数据存放在表里,在表中建立了索引,然后将这一系列索引又放到索引表中,又将一系列的索引表放到了一个B+树中,然后将B+树放到了内存,这样效率就大大提升了,因为操作系统每次读取数据都是 4k 所以目前数据库的设计为数据表和索引表的大小都是4K,如比:

查一个数据,它就先判断在哪个区间,然后通过区间去找索引表,然后通过索引找到真正的数据表拿数据
但是硬盘读取就不一样了,它得随机I/O去找数据,有了数据库索引之后,直接就能通过找索引表就能命中数据了,效率大不一样。

总结:

  • 硬盘和数据库的读取差距在于索引
  • 数据表 -> 索引表 -> B+树

有了数据库的概念之后,那什么是关系型数据库呢?

3.关系型数据库

关系型数据库在建表的时候,必须给出这个表有多少个字段也就是多少列,而且要给出列的类型,给出列的类型之后它在硬盘开辟的空间就已经被定死了,如果存储的时候,建表是 5 个字段,然后只有1个字段有值,另外4个字段为空,那么其 4个字段就会被 0 填满

那么如果表的数据很多的时候,性能会降低吗?这个分两个情况:

  • 并发高的时候,会受硬盘带宽的影响,这个和数据多不多没关系,主要是带宽问题
  • 看sql的复杂程度,取决于sql ,如果说是行式数据库,完事查 sum 或者是 age 这种,本来就很慢,数据越多越慢

总结:关系型数据库倾向于行级存储

4.内存数据库

因为IO是有瓶颈的,虽然它优化的很好,但是速度还是不够用,所以出现了内存数据库:把数据存储到内存上的数据库,常见的有 Memcached 和 redis 等

Memcached 是 03 年出来的,Redis 是 09 年,虽然两者都是KV存储,但是有一个区别:Memcached的value是没有类型的,而 Redis 有五个基本数据类型,Redis给不同类型提供了很多方法,并且Redis是可以做持久化的,而Memcached没有提供持久化方案

好了,上面讲解了内存读取和硬盘读取速度,以及引入了关系型数据库非关系型数据库(内存数据库/缓存数据库),下面就来看看关系型数据库Mysql和非关系型数据库Redis的区别

二.数据库类型不同

Mysql是关系型数据库,主要用于存放持久数据,将数据存放在硬盘中,读取速度相对较慢

Redis是NOSQL数据库,即非关系型数据库,也是缓存数据库,即数据存储在内存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限  

  • 缓存: 数据交换的缓冲区(cache),当浏览器执行请求时,首先会对在缓存中进行查找,如果存在就获取,否则,就访问数据库

计算机中内存和硬盘的区别

  • 内存具有易失性,只有在当通电系统启动的时候,内存中数据才会存在,当断电之后,内存中数据就不会再存在了,而数据存在硬盘中则不会这样,在硬盘中无论通电与否,数据都可以长期存放在硬盘中
  • 容量不同,内存的容量一般比较小,硬盘的容量一般比较大
  • 速度不同,数据在内存中的读写速度是要比硬盘中快的,在内存中处理数据性能更好

三.作用不同

mysql用于持久化的存储数据到硬盘存储数据量大,功能强大,但是速度较慢

redis用于存储使用较为频繁的数据到内存中,存储数据量小,读取速度快,保存时间有限 

mysql和redis因为需求的不同,一般都是配合使用,比如:当浏览器执行请求时,首先会在缓存中进行查找(redis中查找),如果存在就获取,否则,就访问数据库,这样减少访问数据库的次数,提高运行效率

四.运行机制

MySQL数据库作为存储的关系型数据库,支持分布式事务,可以保证数据的一致性,相对薄弱的地方在于每次请求访问数据库时,都存在着I/O操作,如果反复频繁的访问数据库会产生以下问题:

  • 1.会在反复链接数据库上花费大量的时间,从而导致运行效率过慢
  • 2.反复的访问数据库也会导致数据库的负载过高,那么此时缓存的概念就衍生出来了

Redis是基于单线程的效率比较高, 但不支持分布式事务,在并发访问时可能会出现数据不一致的情况,但是它的数据的读写速度快于传统的关系型数据库 MySQL: 是因为redis是基于内存操作的,故CPU不是性能瓶颈,机器的内存和宽带才是Redis的瓶颈。在实际应用中,Redis 只需要将数据一次性写入内存中,之后对数据的读取及修改则可以在内存中高效地执行,避免了磁盘寻道时间等硬盘操作时间带来的延迟,从而实现了高速访问、高效处理等功能

五.应用场景不同

MySQL适用于大规模数据存储和复杂查询场景,例如电商、金融、物流等领域,MySQL的事务处理数据备份功能可以保证数据的完整性和安全性

Redis适用于高并发读写、数据缓存实时计算等场景,例如社交网络、游戏、广告等领域,Redis的高性能读写丰富的数据结构可以提高系统的响应速度和可扩展性

综上所述,MySQL和Redis在数据存储结构、性能表现、数据一致性和使用场景等方面有很大的差异,在选择数据库管理系统时,需要根据实际需求和应用场景进行综合考虑

六.总结

Redis和MySQL都是通过监听端口接受客户端请求,并根据请求类型执行相应的操作,它们的主要区别在于数据存储的方式和支持的数据结构类型,Redis通过内存存储实现了高速读写,而MySQL通过磁盘存储实现了数据持久化和事务处理

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

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

相关文章

【工具使用-VScode】VScode如何设置空格和tab键显示

一,简介 在提交代码的时候,行末尾的tab和空格不符合规范,但是如果在vscode中不显示tab和空格的话,不能及时的查看到并改正,导致提交代码之后还需要再次进行修改,效率比较低。 代码编辑界面如图所示&#…

【大厂AI课学习笔记NO.68】开源和开源发展情况

开源即源代码公开,任何人能获取源代码,查看、修改、分发他们认为合适的代码。 依托同行评审和社区生成,旨在以分散、协作的方式开发。 我们曾经很详细的讨论过开源协议的问题,详细可以参考我的文章: https://giszz.…

CaricatureFace 学习笔记

目录 3d人脸重建开源项目汇总 CaricatureFace 依赖项: 有的电脑安装失败: 3d人脸重建开源项目汇总 3D人脸重建开源项目整理_reconstruction 项目-CSDN博客 2020 CVPR 漫画三维人脸重建) CaricatureFace 依赖项: openmesh 有的电脑安…

高频设计模式

文章目录 高频设计模式单例模式饿汉式(Eager Initialization)懒汉式(Lazy Initialization)双重校验锁(Double-Checked Locking)静态内部类(Static Inner Class)枚举(Enum…

LeetCode-1004. 最大连续1的个数 III

每日一题系列(day 20) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f50…

软考高级:耦合分类(内容耦合、公共耦合、外部耦合等)概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

docker部署在线聊天室平台Fiora

Fiora 是一款开源免费的在线聊天系统 https://github.com/yinxin630/fiora 部署 创建docker网络 docker network create fiora-networkdocker-compose部署 vim docker-compose.yml version: 3 services:fiora_redis:image: rediscontainer_name: fiora_redisrestart: alway…

Vue3 子/父组件相互调用

1&#xff1a;子组件调用父组件 父组件&#xff1a; <template><div><button style"margin: 50px">父按钮</button> <!--已clk为名称的事件传递给子组件&#xff0c;传递的是父组件的a函数/事件 --><Child clk"a" />…

huggingface实现Bark模型

目录 引言 使用半精度 使用CPU卸载 使用Better Transformer 使用Flash Attention 2 安装 使用 组合优化技术 使用技巧 BarkConfig 实例化 BarkConfig 参数说明 BarkProcessor 参数 __call__ 方法 from_pretrained 方法 save_pretrained 方法 BarkModel 生成…

电脑解锁后黑屏有鼠标--亲测!!不需要重装系统!!

问题&#xff1a;上周电脑黑屏&#xff0c;只有鼠标&#xff0c;鼠标还不能右键&#xff01;&#xff01; 中招&#xff1a;win10系统最新版火绒安全 &#xff0c;那你有概率获得开机黑屏套餐一份。 原因是&#xff1a;火绒把我们的explorer删除了导致黑屏&#xff0c;这个文…

【OpenGL手册11】材质的模型

目录 一、说明二、材质表面和光照三、设置材质四、光的属性五、不同的光源颜色练习 一、说明 在现实世界里&#xff0c;每个物体会对光产生不同的反应。比如&#xff0c;钢制物体看起来通常会比陶土花瓶更闪闪发光&#xff0c;一个木头箱子也不会与一个钢制箱子反射同样程度的…

1分钟带你学会使用装饰器编写Python函数

1.需求 向 test() 函数中&#xff0c;新增一个功能&#xff0c;多输出一句话"给他补铁" def test():print("水中放吸铁石") # test()# 第一种方式&#xff1a;重写函数 def test():print("水中放吸铁石")print("给他补铁") test()# …

Hibernate是如何处理事务的?请描述一下Hibernate的事务管理。Hibernate中的缓存机制是怎样的?如何配置和使用缓存?

Hibernate是如何处理事务的&#xff1f;请描述一下Hibernate的事务管理。 Hibernate是一个强大的Java ORM框架&#xff0c;它提供了对数据库事务的透明管理。Hibernate的事务管理基于Java的JTA&#xff08;Java Transaction API&#xff09;和JDBC&#xff08;Java Database Co…

什么是移动计算?中国Java之父余胜军被刷爆的CDN又是什么?

移动计算 移动计算通常指的是将计算任务从其原始位置转移到距离数据存储地更近的地点进行处理的概念。这个概念基于一个核心原则&#xff1a;数据传输的成本&#xff08;包括时间、带宽和资源消耗&#xff09;通常高于将计算任务移动到数据所在位置的成本。因此&#xff0c;移…

自增自减运算符 i++,++i,i--,--i小窍门

符号在前就先加/减&#xff0c;符号在后就后加/减 在写代码的过程中&#xff0c;常见的一种情况是需要某个整数类型变量增加 1 或减少 1&#xff0c;Java 提供了一种特殊的运算符&#xff0c;用于这种表达式&#xff0c;叫做自增运算符&#xff08;)和自减运算符&#xff0…

py脚本模拟json数据,StructuredStreaming接收数据存储HDFS一些小细节 ERROR:‘path‘ is not specified

很多初次接触到StructuredStreaming 应该会写一个这样的案例 - py脚本不断产生数据写入linux本地&#xff0c; 通过hdfs dfs 建目录文件来实时存储到HDFS中 1. 指定数据schema&#xff1a; 实时json数据 2. 数据源地址&#xff1a;HDFS 3. 结果落地位置&#xff1a; HDFS …

高级语言讲义2010软专(仅高级语言部分)

1.编写一程序&#xff0c;对输入的正整数&#xff0c;求他的约数和。 如&#xff1a;18的约数和为1236939 #include <stdio.h>int getsum(int n){int i,sum0;for(i1;i<n;i)if(n%i0)sumi;return sum; } int main(){int sum getsum(18);printf("%d",sum); …

NOIP2004 提高组 津津的储蓄计划(选自洛谷P1089)

题目描述 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300300 元钱&#xff0c;津津会预算这个月的花销&#xff0c;并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄&#xff0c;妈妈提出&#xff0c;津津可以随时把整百的钱存在她那里&#xff0c;到…

PCB检测,基于YOLOV8NANO

PCB检测&#xff0c;基于YOLOV8NANO&#xff0c;训练得到PT模型&#xff0c;转换成ONNX&#xff0c;只需要OPENCV&#xff0c;支持C/PYTHON/ANDROID开发PCB检测&#xff0c;基于YOLOV8NANO&#xff0c;只需要OPENCV

每日一题leetcode第2834:找出美丽数组的最小和

目录 一.题目描述 二.思路及优化 三.C代码 一.题目描述 二.思路及优化 首先我们看到这个题&#xff0c;就是根据给出的数组元素个数N&#xff0c;从[1&#xff0c;N]找出N个元素&#xff0c;使得N个元素的和最小&#xff0c;其中随便抽两个数出来&#xff0c;两个数之和不能为…