程序员必知的缓存套图

简介: 程序员必知的缓存套图

文章目录


1. 线程与进程

1.1 进程:

进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

1.2. 线程:

线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

1.3. 关系

每个进程都有相应的线程,在执行程序时,实际上是执行相应的一系列线程。进程是资源分配的最小单位,线程是程序执行的最小单位。

2. 浏览器内核模块组成

4. 事件循环机制

模型的运转流程:

执行初始化代码, 将事件回调函数交给对应模块管理

当事件发生时, 管理模块会将回调函数及其数据添加到回调列队中

只有当初始化代码执行完后(可能要一定时间), 才会遍历读取回调队列中的回调函数执行

5. 缓存

5.1. 缓存理解

  1. 缓存定义:
  2. 浏览器在本地磁盘上将用户之前请求的数据存储起来,当访问者再次需要改数据的时候无需再次发送请求,直接从浏览器本地获取数据
  3. 缓存的好处:
  4. 减少请求的个数
  5. 节省带宽,避免浪费不必要的网络资源
  6. 减轻服务器压力
  7. 提高浏览器网页的加载速度,提高用户体验
var dt = new Date();
dt.setSeconds(dt.getSeconds() + 60);
document.cookie = "cookietest=1; expires=" + dt.toGMTString();
var cookiesEnabled = document.cookie.indexOf("cookietest=") != -1;
//是否启用cookie
if(!cookiesEnabled){
    alert("没有启用cookie ");
}else{
    alert("已经启用cookie ");
}

5.2. 缓存分类

  1. 强缓存
  2. 不会向服务器发送请求,直接从本地缓存中获取数据
  3. 请求资源的的状态码为: 200 ok(from memory cache)
  4. 协商缓存
  5. 向服务器发送请求,服务器会根据请求头的资源判断是否命中协商缓存
  6. 如果命中,则返回304状态码通知浏览器从缓存中读取资源
  7. 强缓存 & 协商缓存的共同点
  8. 都是从浏览器端读取资源
  9. 强缓存 VS 协商缓存的不同点
  1. 强缓存不发请求给服务器
  2. 协商缓存发请求给服务器,根据服务器返回的信息决定是否使用缓存

5.3. 缓存使用示意图

5.4. 缓存中的header参数

强缓存的header参数

  1. expires:
  2. 这是http1.0时的规范;它的值为一个绝对时间的GMT格式的时间字符串,如Mon, 10 Jun 2015 21:31:12 GMT,如果发送请求的时间在expires之前,那么本地缓存始终有效,否则就会发送请求到服务器来获取资源
  3. cache-control:max-age=number
  4. 这是http1.1时出现的header信息,主要是利用该字段的max-age值来进行判断,它是一个相对值;资源第一次的请求时间和Cache-Control设定的有效期,计算出一个资源过期时间,再拿这个过期时间跟当前的请求时间比较,如果请求时间在过期时间之前,就能命中缓存,否则就不行;
  5. cache-control常用的值(做一个简单了解即可):
  6. no-cache: 不使用本地缓存,需要使用协商缓存。先与服务器确认返回的响应是否被更改,如果之前的响应中存在Etag,那么请求的额时候会与服务器端进行验证,如果资源为被更改则使用缓存。
  7. no-store: 直接禁止游览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源。
  8. public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。
  9. private:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。
  10. 注意:当cache-control与Expires共存的时候cache-control的优先级高

协商缓存的header参数

重点:协商缓存都是由服务器来确定缓存资源是否可用的,所以客户端与服务器端要通过某种标识来进行通信,从而让服务器判断请求资源是否可以缓存访问

  • Last-Modified/If-Modified-Since:二者的值都是GMT格式的时间字符串
  1. 浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上Last-Modified的header,这个header表示这个资源在服务器上的最后修改时间
  2. 浏览器再次跟服务器请求这个资源时,在request的header上加上If-Modified-Since的header,这个header的值就是上一次请求时返回的Last-Modified的值
  3. 服务器再次收到资源请求时,根据浏览器传过来If-Modified-Since和资源在服务器上的最后修改时间判断资源是否有变化,如果没有变化则返回304 Not Modified,但是不会返回资源内容;如果有变化,就正常返回资源内容。当服务器返回304 Not Modified的响应时,response header中不会再添加Last-Modified的header,因为既然资源没有变化,那么Last-Modified也就不会改变,这是服务器返回304时的response header
  4. 浏览器收到304的响应后,就会从缓存中加载资源
  5. 如果协商缓存没有命中,浏览器直接从服务器加载资源时,Last-Modified的Header在重新加载的时候会被更新,下次请求时,If-Modified-Since会启用上次返回的Last-Modified值
  6. 图例:
  • Etag/If-None-Match
  1. 这两个值是由服务器生成的每个资源的唯一标识字符串,只要资源有变化就这个值就会改变
  2. 其判断过程与Last-Modified/If-Modified-Since类似
  • 既生Last-Modified何生Etag
  1. HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题
  2. 一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET
  3. 某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);
  4. 某些服务器不能精确的得到文件的最后修改时间。

小结:

利用Etag能够更加准确的控制缓存,因为Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符。

Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。


相关文章
|
缓存 Java 数据库连接
「Java面试」五年Java程序员去某东面试竟然在MyBatis缓存这翻车
一个5年工作经验的小伙伴,去面某东被问到MyBatis何时使用一级缓存,何时使用二级缓存?去之前还特地复习了MyBatis的相关知识,想着自己用MyBatis用得比较熟练了,竟然在这道题上翻车了。 今天,我给大家来分享一下MyBatis的缓存机制。
81 0
|
消息中间件 缓存 NoSQL
程序员快来学习缓存层场景实战数据收集—技术选型思路及整体方案
根据以上业务场景,项目组提炼出了6点业务需求,并针对业务需求梳理了技术选型相关思路。 1)原始数据海量:对于这一点,初步考虑使用HBase进行持久化。 2)对于埋点记录的请求响应要快:埋点记录服务会把原始埋点记录存放在一个缓存层,以此保证响应快速。关于这一点有多个缓存方案,稍后展开讨论。 3)可通过后台查询原始数据:如果直接使用HBase作为查询引擎,查询速度太慢,所以还需要使用Elasticsearch来保存查询页面上作为查询条件的字段和活动ID。
|
存储 缓存 Unix
《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——导读
虽然高速缓存能够在多处理器中增加有效的存储器带宽,但是高速缓存结构对于管理它所需要的操作系统开销有很大的影响,这又反过来影响了系统的整体性能。
2025 0
|
缓存 Unix 程序员
《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——2.14 进一步的读物
本节书摘来自异步社区《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》一书中的第2章,第2.14节,作者:【美】Curt Schimmel著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1551 0
|
缓存 算法 Unix
《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——2.13 习题
一个程序通过每次将一个字保存到存储器连续的地址中来使存储器清零。观察一个系统,它采用带有写分配的写回高速缓存,在一开始被清零的存储器块并没有被高速缓存起来的时候,该系统会发生什么样的情况?假定行的大小比一个字大,第一次把数据保存到每一行中的时候会造成一次缺失,要从主存储器读取该行的内容。
1553 0
|
缓存 Unix 程序员
《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——2.12 各种高速缓存体系的差异
前5项影响高速缓存的性能,而且从保持高速缓存一致性的角度来看,除了一项(组大小)之外,其他的项对操作系统都没有直接影响。偶尔必须考虑一下组的大小,这将在3.3.2、4.2.2和4.2.6节中介绍。清单中的最后3项也影响性能,但是它们还影响操作系统。
1136 0
|
缓存 Unix 程序员
《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——2.11 高速缓存的性能
虽然全面讨论高速缓存的性能超出了本书的范围,但还是可以做以下一些观察。首先,高速缓存的性能不仅取决于高速缓存的设计,而且取决于应用程序的引用模式。因此,必须谨慎地通过测试基准程序来判定高速缓存的性能以及一般化测试结果。
1098 0
|
缓存 Unix 程序员
《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》——2.10 独立的指令高速缓存和数据高速缓存
将指令高速缓存和数据高速缓存分开的做法目前在计算机系统中相当常见。这种做法能够有效地使高速缓存的带宽加倍,因为它能让CPU从指令高速缓存预取指令的同时把数据载入或者保存到数据高速缓存中。图2-17描绘了这样的一种组织结构。
1330 0
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
74 6