mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
[docs update]完善cdn部分的内容
This commit is contained in:
parent
61ab3dc5a7
commit
c0765af4b2
@ -52,13 +52,22 @@ head:
|
|||||||
|
|
||||||
### 静态资源是如何被缓存到 CDN 节点中的?
|
### 静态资源是如何被缓存到 CDN 节点中的?
|
||||||
|
|
||||||
你可以通过预热的方式将源站的资源同步到 CDN 的节点中。这样的话,用户首次请求资源可以直接从 CDN 节点中取,无需回源。这样可以降低源站压力,提升用户体验。
|
你可以通过 **预热** 的方式将源站的资源同步到 CDN 的节点中。这样的话,用户首次请求资源可以直接从 CDN 节点中取,无需回源。这样可以降低源站压力,提升用户体验。
|
||||||
|
|
||||||
如果不预热的话,你访问的资源可能不在 CDN 节点中,这个时候 CDN 节点将请求源站获取资源,这个过程是大家经常说的 **回源**。
|
如果不预热的话,你访问的资源可能不在 CDN 节点中,这个时候 CDN 节点将请求源站获取资源,这个过程是大家经常说的 **回源**。
|
||||||
|
|
||||||
**命中率** 和 **回源率** 是衡量 CDN 服务质量两个重要指标。命中率越高越好,回源率越低越好。
|
> - 回源:当 CDN 节点上没有用户请求的资源或该资源的缓存已经过期时,CDN 节点需要从原始服务器获取最新的资源内容,这个过程就是回源。当用户请求发生回源的话,会导致该请求的响应速度比未使用 CDN 还慢,因为相比于未使用 CDN 还多了一层 CDN 的调用流程。
|
||||||
|
> - 预热:预热是指在 CDN 上提前将内容缓存到 CDN 节点上。这样当用户在请求这些资源时,能够快速地从最近的 CDN 节点获取到而不需要回源,进而减少了对源站的访问压力,提高了访问速度。
|
||||||
|
|
||||||
如果资源有更新的话,你也可以对其 **刷新** ,删除 CDN 节点上缓存的资源,当用户访问对应的资源时直接回源获取最新的资源,并重新缓存。
|

|
||||||
|
|
||||||
|
如果资源有更新的话,你也可以对其 **刷新** ,删除 CDN 节点上缓存的旧资源,并强制 CDN 节点回源站获取最新资源。
|
||||||
|
|
||||||
|
几乎所有云厂商提供的 CDN 服务都具备缓存的刷新和预热功能(下图是阿里云 CDN 服务提供的相应功能):
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
**命中率** 和 **回源率** 是衡量 CDN 服务质量两个重要指标。命中率越高越好,回源率越低越好。
|
||||||
|
|
||||||
### 如何找到最合适的 CDN 节点?
|
### 如何找到最合适的 CDN 节点?
|
||||||
|
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -10,9 +10,9 @@ tag:
|
|||||||
>
|
>
|
||||||
> <br/>
|
> <br/>
|
||||||
>
|
>
|
||||||
> **原文地址:** https://mp.weixin.qq.com/s/6hUU6SZsxGPWAIIByq93Rw
|
> **原文地址:** <https://mp.weixin.qq.com/s/6hUU6SZsxGPWAIIByq93Rw>
|
||||||
|
|
||||||
我想你肯定遇到过这样一类程序员:**他们无论是写代码,还是写文档,又或是和别\*\***人沟通,都显得特别专业\*\*。每次遇到这类人,我都在想,他们到底是怎么做到的?
|
我想你肯定遇到过这样一类程序员:**他们无论是写代码,还是写文档,又或是和别人沟通,都显得特别专业**。每次遇到这类人,我都在想,他们到底是怎么做到的?
|
||||||
|
|
||||||
随着工作时间的增长,渐渐地我也总结出一些经验,他们身上都保持着一些看似很微小的优秀习惯,但正是因为这些习惯,体现出了一个优秀程序员的基本素养。
|
随着工作时间的增长,渐渐地我也总结出一些经验,他们身上都保持着一些看似很微小的优秀习惯,但正是因为这些习惯,体现出了一个优秀程序员的基本素养。
|
||||||
|
|
||||||
|
@ -8,6 +8,8 @@ tag:
|
|||||||
|
|
||||||
> **推荐语**:普通程序员要想成长为高级程序员甚至是专家等更高级别,应该注意在哪些方面注意加强?开发内功修炼号主飞哥在这篇文章中就给出了七条实用的建议。
|
> **推荐语**:普通程序员要想成长为高级程序员甚至是专家等更高级别,应该注意在哪些方面注意加强?开发内功修炼号主飞哥在这篇文章中就给出了七条实用的建议。
|
||||||
>
|
>
|
||||||
|
> <br/>
|
||||||
|
>
|
||||||
> **内容概览**:
|
> **内容概览**:
|
||||||
>
|
>
|
||||||
> 1. 刻意加强需求评审能力
|
> 1. 刻意加强需求评审能力
|
||||||
@ -18,7 +20,7 @@ tag:
|
|||||||
> 6. 关注全局
|
> 6. 关注全局
|
||||||
> 7. 归纳总结能力
|
> 7. 归纳总结能力
|
||||||
>
|
>
|
||||||
> **原文地址**:https://mp.weixin.qq.com/s/8lMGzBzXine-NAsqEaIE4g
|
> **原文地址**:<https://mp.weixin.qq.com/s/8lMGzBzXine-NAsqEaIE4g>
|
||||||
|
|
||||||
### 建议 1:刻意加强需求评审能力
|
### 建议 1:刻意加强需求评审能力
|
||||||
|
|
||||||
|
@ -6,7 +6,9 @@ tag:
|
|||||||
- 练级攻略
|
- 练级攻略
|
||||||
---
|
---
|
||||||
|
|
||||||
> **推荐语**:这篇文章的作者有着丰富的工作经验,曾在大厂工作了 12 年。结合自己走过的弯路和接触过的优秀技术人,他总结出了一些对于个人成长具有普遍指导意义的经验和特质
|
> **推荐语**:这篇文章的作者有着丰富的工作经验,曾在大厂工作了 12 年。结合自己走过的弯路和接触过的优秀技术人,他总结出了一些对于个人成长具有普遍指导意义的经验和特质。
|
||||||
|
>
|
||||||
|
> <br/>
|
||||||
>
|
>
|
||||||
> **原文地址:** <https://mp.weixin.qq.com/s/vIIRxznpRr5yd6IVyNUW2w>
|
> **原文地址:** <https://mp.weixin.qq.com/s/vIIRxznpRr5yd6IVyNUW2w>
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ tag:
|
|||||||
>
|
>
|
||||||
> <br/>
|
> <br/>
|
||||||
>
|
>
|
||||||
> **原文地址:** https://mp.weixin.qq.com/s/YrN8T67s801-MRo01lCHXA
|
> **原文地址:** <https://mp.weixin.qq.com/s/YrN8T67s801-MRo01lCHXA>
|
||||||
|
|
||||||
## 1. 前言
|
## 1. 前言
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ tag:
|
|||||||
>
|
>
|
||||||
> <br/>
|
> <br/>
|
||||||
>
|
>
|
||||||
> **原文地址:** https://mp.weixin.qq.com/s/CTbEdi0F4-qFoJT05kNlXA
|
> **原文地址:** <https://mp.weixin.qq.com/s/CTbEdi0F4-qFoJT05kNlXA>
|
||||||
|
|
||||||
苦海无边,回头无岸。
|
苦海无边,回头无岸。
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
icon: creative
|
icon: creative
|
||||||
title: JavaGuide(Java学习&&面试指南)
|
title: JavaGuide(Java学习&面试指南)
|
||||||
---
|
---
|
||||||
|
|
||||||
::: tip 友情提示
|
::: tip 友情提示
|
||||||
|
@ -129,7 +129,7 @@ public boolean add(E e) {
|
|||||||
|
|
||||||
从上面的源码可以看出:
|
从上面的源码可以看出:
|
||||||
|
|
||||||
- `add`方法内部用到了 `ReentrantLock` 加锁,保证了同步,避免了多线程写的时候会复制出多个副本出来。
|
- `add`方法内部用到了 `ReentrantLock` 加锁,保证了同步,避免了多线程写的时候会复制出多个副本出来。锁被修饰保证了锁的内存地址肯定不会被修改,并且,释放锁的逻辑放在 `finally` 中,可以保证锁能被释放。
|
||||||
- `CopyOnWriteArrayList` 通过复制底层数组的方式实现写操作,即先创建一个新的数组来容纳新添加的元素,然后在新数组中进行写操作,最后将新数组赋值给底层数组的引用,替换掉旧的数组。这也就证明了我们前面说的:`CopyOnWriteArrayList` 线程安全的核心在于其采用了 **写时复制(Copy-On-Write)** 的策略。
|
- `CopyOnWriteArrayList` 通过复制底层数组的方式实现写操作,即先创建一个新的数组来容纳新添加的元素,然后在新数组中进行写操作,最后将新数组赋值给底层数组的引用,替换掉旧的数组。这也就证明了我们前面说的:`CopyOnWriteArrayList` 线程安全的核心在于其采用了 **写时复制(Copy-On-Write)** 的策略。
|
||||||
- 每次写操作都需要通过 `Arrays.copyOf` 复制底层数组,时间复杂度是 O(n) 的,且会占用额外的内存空间。因此,`CopyOnWriteArrayList` 适用于读多写少的场景,在写操作不频繁且内存资源充足的情况下,可以提升系统的性能表现。
|
- 每次写操作都需要通过 `Arrays.copyOf` 复制底层数组,时间复杂度是 O(n) 的,且会占用额外的内存空间。因此,`CopyOnWriteArrayList` 适用于读多写少的场景,在写操作不频繁且内存资源充足的情况下,可以提升系统的性能表现。
|
||||||
- `CopyOnWriteArrayList` 中并没有类似于 `ArrayList` 的 `grow()` 方法扩容的操作。
|
- `CopyOnWriteArrayList` 中并没有类似于 `ArrayList` 的 `grow()` 方法扩容的操作。
|
||||||
|
Loading…
x
Reference in New Issue
Block a user