计算机缓存也就是通常说的Cache,对计算机编程有所了解的应该都知道,缓存常与Redis联系在一起,但是Redis仅仅是应用中的一部分。

1、浏览器缓存

浏览器面对的问题是网络访问的速度远远低于本地访问的速度,每次都访问造成网络开销太大,于是就增加了一个中间层:开辟“缓存”区域,缓存JS, HTML, CSS,图片等各种文件。浏览器遵循一定的规则来判断什么时候用缓存中的文件,什么时候去访问服务器的新文件。在服务器发给浏览器的响应中,有expires, max-age, last-modified等,Header, expires 和 max-age 定义了一个资源的过期时间, last-modified和Etag用来检查一个资源在服务器端有没有变化。

浏览器缓存示意图

流程如下:

地址栏中输入网址,按回车以后浏览器会使用Expires,max-age来查看本地缓存的内容是否失效,如果没有,就直接使用 。

浏览器刷新按钮的时候浏览器不再考虑Expires,max-age, 而是把Last-Modified / ETag 发到服务器去,问问服务器,这个文件有更新没有?如果没有,那就用本地缓存的文件,如果有更新,用服务器端最新的。

强制刷新的时候不使用任何缓存,直接向服务器发出新请求。

数据配置项

2、CDN

如果客户端离服务器距离比较远,网速会慢,体验会差;海量的用户给后端服务器带来巨大压力,所以CDN就采用了就近访问的方案:把后端服务器的数据数据复制多份,挪到离客户端比较近的“服务器中,不但减少了访问的时间,还大大降低了 “中央”服务器的负载。 浏览器缓存和CDN是配合使用的, 浏览器的本地缓存失效以后,就需要向后端服务器来获取了,但是如果系统有CDN,浏览器还可以就近访问CDN,这样用户体验就不会差。

是否使用CDN对比

3、Page Cache

操作系统的时间是按纳秒为单位的,虽然内存和硬盘都在同一台机器中,没有网络开销,但是硬盘实在是太慢,比内存慢几万倍, 内存等不及。 所以操作系统也增加了一个抽象层:Page cache , 把硬盘的文件缓存在其中。 几乎所有的文件读写操作都依赖Page Cache,在向硬盘写入文件的时候,并不是直接把文件内容写入硬盘以后才返回的,而是写入到内核的Page Cache就直接返回了。 当从硬盘读取文件时,也不是直接把数据从硬盘复制到用户态的内存,而是先复制到内核的Page Cache ,然后再复制到用户态的内存。

4、应用程序缓存

应用程序缓存大家都很熟悉, 因为数据库访问速度慢,无法应对大量的并发访问,所以增加一个缓存中间层,把最火热的数据从数据库中取出,放到快速访问的内存中。应用程序的缓存也是个双刃剑,虽然提升了访问效率, 但带来了很多问题:

应用程序、缓存、数据库三者关系图

代码变复杂

需要处理缓存和数据库之间的数据一致性问题

存在穿透,雪崩等问题

应用程序缓存现在已经变成了分布式的集群形式,数据管理很麻烦。

5、CPU缓存

虽说内存速度快, 可是在CPU面前,内存也只能屈居下风,CPU比内存快的多得多,数据和指令必须从内存加载到CPU才能执行, 为了解决速度匹配问题就在CPU内增加缓存中间层,不过必须用硬件来实现。

CPU、CPU缓存、内存关系图

CPU的缓存包括L1、L2、 L3这三级Cache,把最火热的访问数据放入到其中。

在L1 Cache 最靠近CPU,速度最快,可以分为指令Cache (CPU要执行的指令)和数据Cache(指令要操作的数据)。 CPU Cache 和上面提到的各种Cache比起来,小得可怜,也就是几百K到几M。 所以这些Cache要想发挥真正的作用,必须得依赖规矩局部性原理:

时间局部性:如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执行;如果某数据被访问,则不久之后该数据可能再次被访问。

空间局部性:指一旦程序访问了某个存储单元,则不久之后。其附近的存储单元也将被访问。

总结

对于数据读写不匹配的问题,一般的解决办法就是增加一个空间层,用空间的冗余来换取时间的匹配,同时要遵循下列原则:

数据的读操作远大于写操作

数据计算过程比较耗时

数据是某个数据源的数据备份

数据访问遵循“局部性原理”

计算机网络中缓存技术,编程达人相关推荐

  1. springboot中缓存技术的使用、原理及其运行流程

    Springboot中缓存的工作原理 要想在springboot中使用缓存,首先要了解springboot中缓存的工作原理. 我们知道springboot在启动时会有很多的自动配置类(xxx-Auto ...

  2. 8分钟带你学会SpringBoot整合Redis来实现缓存技术

    1.概述 随着互联网技术的发展,对技术要求也越来越高,所以在当期情况下项目的开发中对数据访问的效率也有了很高的要求,所以在项目开发中缓存技术使用的也越来越多,因为它可以极大的提高系统的访问速度,关于缓 ...

  3. python缓存技术_高级Python技术:如何在Python应用程序中实现缓存

    缓存的重要性 缓存对于每个Python程序员来说都是一个需要理解的重要概念. 简而言之,缓存的概念主要是利用编程技术将数据存储在临时位置,而不是每次都从源检索数据. 随后,缓存可以提高应用程序的性能, ...

  4. DotNET企业架构应用实践-系统架构与性能-缓存技术与ORM中的缓存查询技术

    系列回顾 在前面的文章DotNET企业架构应用实践-系统架构与性能-理论依据及相关做法一文中我介绍了系统性能优化的理论做了一个概括的介绍,也简单的介绍了性能优化的过程及相关的技术关注点或者说是做法. ...

  5. Android 开发中的多线程编程技术

    此文章来自"Intel Software"应用开发 多线程这个令人生畏的"洪水猛兽",很多人谈起多线程都心存畏惧.在Android开发过程中,多线程真的很难吗? ...

  6. PHP 中 9 大缓存技术总结

    1.全页面静态化缓存 也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程.此种方式,在CMS系统中比较常见,比如dedecms: 一种比较常用的实现方 ...

  7. Android开发中的多线程编程技术

    Android开发中的多线程编程技术 [IT168技术]多线程这个令人生畏的"洪水猛兽",很多人谈起多线程都心存畏惧.在Android开发过程中,多线程真的很难吗?多线程程序的&q ...

  8. 浅谈缓存技术在ASP.NET中的运用

    本篇文章虽不谈架构,但是Cache又是架构中不可或缺的部分,因此,在讲解Cache的同时,将会提及到部分架构知识,关于架构部分,读者可以不用理解,或者直接跳过, 你只需关心Cache即可,具体的架构, ...

  9. 交换系统可以在计算机网络应用吗,数据通信交换技术在计算机网络中的应用

    [摘要] 本文主要针对于计算机网络中的数据通信交换技术构架进行全面的分析,要充分结合计算机通信的全新理念,对于电路进行交换和分组,从而能够进行技术上的交换. [关键词] 计算机网络 数据通信交换技术 ...

最新文章

  1. 3D目标检测多模态融合算法综述
  2. 2020-10-29Ubuntu20.04将软件添加至桌面
  3. 判断为空时候,如何判断一堆空格为空?
  4. [原]编程融入生活---设计模式总结
  5. 介绍一种很棒的wince 如何替换系统声音的方法
  6. JQuery仿最新淘宝网首页带箭头幻灯片,JQuery轮播图
  7. python多线程的作用_Python多线程中三个函数的强大功能简介
  8. matlab验证对称三相电路,不对称三相电路中,中线的电流为()。 A.0 B. C. D....
  9. 老师 累了,我们 泪了!
  10. 小米11顶配版屏幕参数曝光:2K 120Hz高刷屏支持运动补偿
  11. aix创建oracle表空间,Oracle for AIX基于裸设备的表空间扩充步聚
  12. 书单丨成为全栈工程师的5种硬实力
  13. JQuery Tables 的应用(二)
  14. spring mvc 返回json的配置
  15. php 7中文手册pdf版,手册的格式 - PHP 7 中文文档
  16. 未安装任何音频输出设备 解决方案
  17. 如何将图片转成png格式?图片的格式怎么转换
  18. python图形包是什么_介绍Python 图形计算工具包
  19. Gradle项目在IDEA中运行时提示:Unnecessarily replacing a task that does not exist is not supported. Use create
  20. 表示学习(Representation Learning)之局部表示(Local Representation)与分布式表示(Distributed Representation)

热门文章

  1. Android技巧分享——Android开发超好用工具吐血推荐 转载
  2. transition过渡的趣玩
  3. springJDBC一对多关系,以及Java递归,jsp递归的实现
  4. 每天看一片代码系列(三):codepen上一个音乐播放器的实现
  5. Oracle 9i 在 Red Hat 7.1 和 7.2 上的装配
  6. Visual Studio “类视图”和“对象浏览器”图标
  7. .net 中使用socket (c#)
  8. 操作系统学习笔记-2.1.5线程概念和多线程模型
  9. 牛客16585 统计单词数
  10. python-scrapy爬虫框架