缓存和缓冲的区别

news2025/1/20 1:47:16

近期被这两个词汇困扰了,感觉有本质的区别,搜了一些资料,整理如下

计算机内部的几个部分图如下

缓存(cache)

https://baike.baidu.com/item/%E7%BC%93%E5%AD%98

提到缓存(cache),就想到了 cpu 高速缓存,其实最开始的缓存也是这个。

目的就是为了让 cpu 和内存之间的数据交互速度变快设计的。

从下到上访问速度依次递减,容量也越来越大。内存的访问速度比 cpu 缓存访问速度慢 100倍。

https://www.zhihu.com/question/349982942/answer/2935754503

其他缓存

浏览器缓存

https://baike.baidu.com/item/%E6%B5%8F%E8%A7%88%E5%99%A8%E7%BC%93%E5%AD%98

之前的时代,网络不发达,带宽小,有了浏览器,打开一个网页需要每次加载页面需要的资源会时间长,后面浏览器的开发者就想到了重复的资源没必要重新加载,就考虑到浏览器缓存。

对于访问的资源如果每个请求后面都加了时间戳就没缓存了(缓存失效),相对于不加对于打开一个页面会发现明显变慢。

内存缓存 redis

对于数据库访问这块,为了减少数据库的访问次数,redis 的大神就想到了在内存中暂存这些数据。

因为内存通常来讲大一些,速度比硬盘快多了,所以在内存上暂存数据是一个不错的选择。

但是 redis 不是只有缓存功能,还有一些其他的功能。

缓冲(buffer)

为了提高内存和硬盘或其他io设备之间数据交换的速度设计的。在上面 cpu 缓存的基础上,硬盘比内存慢了几个数量级。

本质就是在内存上单独开辟了一个数组来存储当前的数据,将对磁盘的操作由随机操作变为顺序操作。由于磁盘的随机操作与顺序操作之间的数量级差距,在执行结果中会看到明显的差距。是用空间换时间的思想的实现。

压缩文件类似原理,将一个文件夹中的多个文件进行压缩,将多个小文件整理为一个文件,在磁盘上空间连续,在传输的过程中感觉快,如果是复制整个文件夹,会发现传输时间相对于压缩文件长,对于那些小文件数量多的情况下特别明显。

java 实现

如下 java.io 自带的原始的缓冲类

BufferedInputStream

package java.io;

public class BufferedInputStream extends FilterInputStream {
    private static int DEFAULT_BUFFER_SIZE = 8192;
    protected volatile byte buf[];

    public BufferedInputStream(InputStream in) {
        this(in, DEFAULT_BUFFER_SIZE);
    }
}


BufferedOutputStream

package java.io;

public class BufferedOutputStream extends FilterOutputStream {

    protected byte buf[];

    public BufferedOutputStream(OutputStream out) {
        this(out, 8192);
    }
}	

BufferedReader

package java.io;

public class BufferedReader extends Reader {

    private Reader in;

    private char cb[];

    private static int defaultCharBufferSize = 8192;
	
    public BufferedReader(Reader in, int sz) {
        super(in);
        if (sz <= 0)
            throw new IllegalArgumentException("Buffer size <= 0");
        this.in = in;
        cb = new char[sz];
        nextChar = nChars = 0;
    }

    public BufferedReader(Reader in) {
        this(in, defaultCharBufferSize);
    }
}	


BufferedWriter

package java.io;

public class BufferedWriter extends Writer {

    private Writer out;

    private static int defaultCharBufferSize = 8192;

    public BufferedWriter(Writer out) {
        this(out, defaultCharBufferSize);
    }
}

每个类中声明的缓冲数组在没有指定大小的情况下都是 8192,即 8MB。体现了预读的思想。

https://blog.csdn.net/qingfan_714/article/details/115439234

数据库中的 join buffer

mysql 中针对多表联合查询,在驱动表中会查询出符合要求的数据放在内存中与被驱动表进行嵌套查询。因为数据库的数据存储在磁盘上,由于存储设备与内存数据访问的速度差距,将数据放在内存中暂存是一个很好的选择,但是驱动表的数据需要做筛选,数据量不能多,遵循小表驱动大表原则。

总结

缓存和缓冲都是为了解决计算机的各个部分的访问速度设计的。

针对 cpu 和内存之间的速度慢的问题,设计了 cpu 与内存中间的三个级别的缓存。

针对内存与存储设备之间的速度慢的问题,编码在内存层面设计了缓冲区域将读取或者写入的数据批量处理。将存储设备的随机处理变为顺序处理,是空间换时间思想的实现。

在日常开发中,遇到的问题瓶颈一般是缓冲的问题。因为内存和 cpu 之间的缓存我们无法控制,但是在内存和硬盘层面的缓冲现有的工具无法满足我们可以自己编码处理。

参考链接

https://zhidao.baidu.com/question/7153396.html

https://blog.csdn.net/weixin_42559574/article/details/115290225

https://zhuanlan.zhihu.com/p/376380293

https://www.cnblogs.com/smalldong/p/14337528.html

https://baike.baidu.com/item/%E7%BC%93%E5%86%B2%E6%8A%80%E6%9C%AF/1937843

https://www.cnblogs.com/taking/p/15707375.html

https://zhuanlan.zhihu.com/p/563185831

https://www.jianshu.com/p/d049943a9cc5

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

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

相关文章

【LeetCode-剑指offer】--3.比特位计数

3.比特位计数 class Solution {public int[] countBits(int n) {int[] bites new int[n 1];for(int i 0 ; i < n;i){bites[i] Count(i);}return bites;}public int Count(int x){int count 0;while(x > 0){x & (x - 1);count;}return count;} }

【SVN】Windows版合并提交bat文件+自定义菜单快捷键

【工具向】利用bat批处理打开TortoiseGit简化版本管理流程_tortoisegit bat-CSDN博客 start cmd /k "cd C:\YourBranchProj && svn cleanup && svn update && svn merge C:\YourTrunkProj -r 历史版本号:HEAD && svn commit -m "me…

项目接口性能优化方案

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表。会点点Java相关技术栈、帆软报表、低代码平台快速开发。技术尚浅&#xff0c;闭关学习中 &#x1f60…

论文阅读《Restormer: Efficient Transformer for High-Resolution Image Restoration》

论文地址:https://openaccess.thecvf.com/content/CVPR2022/html/Zamir_Restormer_Efficient_Transformer_for_High-Resolution_Image_Restoration_CVPR_2022_paper.html 源码地址:https://github.com/swz30/Restormer 概述 图像恢复任务旨在从受到各种扰动(噪声、模糊、雨滴…

低延时视频技术的应用场景和挑战

编者按 无线网络对人们的生活产生了巨大的影响&#xff0c;而5G技术的引入将彻底改变我们与世界互联互通的方式。在5G时代&#xff0c;实现万物互联离不开低延时技术的应用。 LiveVideoStackCon 2023 深圳站邀请到秒点科技的CEO扶凯&#xff0c;为大家分享低延时技术在物联网、…

家政行业的小程序都需要具备哪些功能?

家政服务小程序&#xff0c;覆盖多城&#xff0c;在线派单 适合行业&#xff1a;家电维修、家政保洁、养生护理、美容美发、预约服务上门等 系统功能&#xff1a;服务管理、商品管理、拼团/秒杀、订单管理、会员管理、派单管理、师傅管理、商家/服务点、财务管理、城市代理、次…

Python算法例30 统计前面比自己小的数

1. 问题描述 给定一个整数数组&#xff08;数组大小为n&#xff0c;元素的取值范围为0~10000&#xff09;&#xff0c;对于数组中的每个元素&#xff0c;计算其前面元素中比它小的元素数量。 2. 问题示例 对于数组[1&#xff0c;2&#xff0c;7&#xff0c;8&#xff0c;5]&…

分享44个PyQt5源码总有一个是你想要的

分享44个PyQt5源码总有一个是你想要的 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1_5H_0Ydg0XUa1fz5Jok51Q?pwd6666 提取码&#xff1a;6666 项目名称 B站直播弹幕姬&#xff…

快速、安全、高效地传输海量小文件

随着互联网技术的不断进步&#xff0c;我们正迈入信息爆炸的时代。在这个时代&#xff0c;企业每天都需要在互联网上传输海量的小文件。与传输常见的大文件相比&#xff0c;海量小文件的传输变得更加困难。接下来&#xff0c;我们将分析海量小文件传输面临的挑战&#xff0c;并…

云原生机器学习平台cube-studio开源项目及代码简要介绍

1. cube-studio介绍 云原生机器学习平台cube-studio介绍&#xff1a;https://juejin.cn/column/7084516480871563272 cube-studio是开源的云原生机器学习平台&#xff0c;目前包含特征平台&#xff0c;支持在/离线特征&#xff1b;数据源管理&#xff0c;支持结构数据和媒体标…

Modbus RTU转Modbus TCP模块,RS232/485转以太网模块,YL102 多功能串口服务器模块

特点&#xff1a; ● Modbus RTU协议自动转换成Mobus TCP协议 ● 100M高速网卡&#xff0c;10/100M 自适应以太网接口 ● 支持 AUTO MDI/MDIX&#xff0c;可使用交叉网线或平行网线连接 ● RS232波特率从300到256000可设置 ● 工作方式可选择TCP Server, TCP Client, U…

中间件系列 - Redis入门到实战(原理篇)

前言 学习视频&#xff1a; 黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 学习目标 Redis数据结构Redis网…

企业员工2024年工作计划和目标怎么写?怎么提醒自己按时执行?

2024年的钟声即将敲响&#xff0c;对于众多企业员工而言&#xff0c;新的一年意味着新的挑战和机遇。而在这之前&#xff0c;制定一份明确的2024年工作计划与目标就显得尤为重要。但不少员工在面对这个任务时&#xff0c;往往感到无从下手&#xff0c;那么如何撰写一份实用且有…

pyCharm 打印控制台中文乱码解决办法

解决方法 在 "File" -> "Settings" 中的控制台设置&#xff1a; 在 "File" -> "Settings" 中&#xff0c;你可以找到 "Editor" -> "General" -> "Console"。在这里&#xff0c;你可能会找到…

frp(实现内网穿透)服务搭建与ssh连接测试

frp 内网穿透 内网穿透的英文叫做NAT traversal&#xff0c;又被称为端口映射或内网映射&#xff0c;内网穿透是网络连接术语&#xff0c;如下图如果我&#xff08;局域网A中的一台服务器&#xff09;想访问另一个局域网c中的一台服务器&#xff0c;可以通过拥有公网ip的B服务…

自动备份B站Up主最新视频到百度网盘的Python脚本详解

自动备份B站Up主最新视频脚本详解&#xff08;Win和Linux有些不同&#xff09; 前言&#xff1a; 次篇文章启发于某些大胆的UP主&#xff08;老马&#xff09;的多次被封&#xff0c;并被下架一些视频。有些人并不能及时观看到&#xff0c;故写一个脚本自动下载最新视频。 &am…

Google Chrome 现在会在后台扫描泄露的密码

谷歌表示&#xff0c;Chrome 安全检查功能将在后台运行&#xff0c;检查网络浏览器中保存的密码是否已被泄露。 如果桌面用户正在使用标记为危险的扩展程序&#xff08;从 Chrome Web Store 中删除&#xff09;、最新的 Chrome 版本&#xff0c;或者如果启用安全浏览来阻止 Go…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之线性布局容器Row组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之线性布局容器Row组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Row组件 沿水平方向布局容器。 子组件 可以包含子组件。 接口 Row(…

【代码随想录】刷题笔记Day41

前言 早上的时间对我来说太重要了&#xff0c;效率很高&#xff0c;感觉是高中养成的习惯&#xff0c;但是就是睡太晚了&#xff0c;早上只有区区两个消失&#xff0c;感觉不够用啊&#xff0c;希望之后可以早点睡和早点起吧&#xff0c;就像大佬说的&#xff0c;人的身体是有…

外贸网站建站怎么做?海洋建站有哪些步骤?

外贸网站建站需要哪些资料&#xff1f;如何选择外贸建站系统&#xff1f; 外贸企业越来越重视在线业务&#xff0c;而拥有一个专业、高效的外贸网站已经成为成功开展国际贸易的关键一步。海洋建站将为您详细介绍如何进行外贸网站建站&#xff0c;让您的企业在全球市场中脱颖而…