auto commit
This commit is contained in:
71
notes/缓存.md
71
notes/缓存.md
@ -1,30 +1,24 @@
|
||||
# 缓存
|
||||
<!-- GFM-TOC -->
|
||||
* [一、缓存特征](#一缓存特征)
|
||||
* [二、缓存位置](#二缓存位置)
|
||||
* [三、CDN](#三cdn)
|
||||
* [四、缓存问题](#四缓存问题)
|
||||
* [五、数据分布](#五数据分布)
|
||||
* [六、一致性哈希](#六一致性哈希)
|
||||
* [七、LRU](#七lru)
|
||||
* [参考资料](#参考资料)
|
||||
* [缓存](#缓存)
|
||||
<!-- GFM-TOC -->
|
||||
|
||||
|
||||
# 一、缓存特征
|
||||
## 一、缓存特征
|
||||
|
||||
## 命中率
|
||||
### 命中率
|
||||
|
||||
当某个请求能够通过访问缓存而得到响应时,称为缓存命中。
|
||||
|
||||
缓存命中率越高,缓存的利用率也就越高。
|
||||
|
||||
## 最大空间
|
||||
### 最大空间
|
||||
|
||||
缓存通常位于内存中,内存的空间通常比磁盘空间小的多,因此缓存的最大空间不可能非常大。
|
||||
|
||||
当缓存存放的数据量超过最大空间时,就需要淘汰部分数据来存放新到达的数据。
|
||||
|
||||
## 淘汰策略
|
||||
### 淘汰策略
|
||||
|
||||
- FIFO(First In First Out):先进先出策略,在实时性的场景下,需要经常访问最新的数据,那么就可以使用 FIFO,使得最先进入的数据(最晚的数据)被淘汰。
|
||||
|
||||
@ -32,43 +26,43 @@
|
||||
|
||||
- LFU(Least Frequently Used):最不经常使用策略,优先淘汰一段时间内使用次数最少的数据。
|
||||
|
||||
# 二、缓存位置
|
||||
## 二、缓存位置
|
||||
|
||||
## 浏览器
|
||||
### 浏览器
|
||||
|
||||
当 HTTP 响应允许进行缓存时,浏览器会将 HTML、CSS、JavaScript、图片等静态资源进行缓存。
|
||||
|
||||
## ISP
|
||||
### ISP
|
||||
|
||||
网络服务提供商(ISP)是网络访问的第一跳,通过将数据缓存在 ISP 中能够大大提高用户的访问速度。
|
||||
|
||||
## 反向代理
|
||||
### 反向代理
|
||||
|
||||
反向代理位于服务器之前,请求与响应都需要经过反向代理。通过将数据缓存在反向代理,在用户请求反向代理时就可以直接使用缓存进行响应。
|
||||
|
||||
## 本地缓存
|
||||
### 本地缓存
|
||||
|
||||
使用 Guava Cache 将数据缓存在服务器本地内存中,服务器代码可以直接读取本地内存中的缓存,速度非常快。
|
||||
|
||||
## 分布式缓存
|
||||
### 分布式缓存
|
||||
|
||||
使用 Redis、Memcache 等分布式缓存将数据缓存在分布式缓存系统中。
|
||||
|
||||
相对于本地缓存来说,分布式缓存单独部署,可以根据需求分配硬件资源。不仅如此,服务器集群都可以访问分布式缓存,而本地缓存需要在服务器集群之间进行同步,实现难度和性能开销上都非常大。
|
||||
|
||||
## 数据库缓存
|
||||
### 数据库缓存
|
||||
|
||||
MySQL 等数据库管理系统具有自己的查询缓存机制来提高查询效率。
|
||||
|
||||
## Java 内部的缓存
|
||||
### Java 内部的缓存
|
||||
|
||||
Java 为了优化空间,提高字符串、基本数据类型包装类的创建效率,设计了字符串常量池及 Byte、Short、Character、Integer、Long、Boolean 这六种包装类缓冲池。
|
||||
|
||||
## CPU 多级缓存
|
||||
### CPU 多级缓存
|
||||
|
||||
CPU 为了解决运算速度与主存 IO 速度不匹配的问题,引入了多级缓存结构,同时使用 MESI 等缓存一致性协议来解决多核 CPU 缓存数据一致性的问题。
|
||||
|
||||
# 三、CDN
|
||||
## 三、CDN
|
||||
|
||||
内容分发网络(Content distribution network,CDN)是一种互连的网络系统,它利用更靠近用户的服务器从而更快更可靠地将 HTML、CSS、JavaScript、音乐、图片、视频等静态资源分发给用户。
|
||||
|
||||
@ -80,9 +74,9 @@ CDN 主要有以下优点:
|
||||
|
||||
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/15313ed8-a520-4799-a300-2b6b36be314f.jpg"/> </div><br>
|
||||
|
||||
# 四、缓存问题
|
||||
## 四、缓存问题
|
||||
|
||||
## 缓存穿透
|
||||
### 缓存穿透
|
||||
|
||||
指的是对某个一定不存在的数据进行请求,该请求将会穿透缓存到达数据库。
|
||||
|
||||
@ -91,7 +85,7 @@ CDN 主要有以下优点:
|
||||
- 对这些不存在的数据缓存一个空数据;
|
||||
- 对这类请求进行过滤。
|
||||
|
||||
## 缓存雪崩
|
||||
### 缓存雪崩
|
||||
|
||||
指的是由于数据没有被加载到缓存中,或者缓存数据在同一时间大面积失效(过期),又或者缓存服务器宕机,导致大量的请求都到达数据库。
|
||||
|
||||
@ -104,7 +98,7 @@ CDN 主要有以下优点:
|
||||
- 也可以进行缓存预热,避免在系统刚启动不久由于还未将大量数据进行缓存而导致缓存雪崩。
|
||||
|
||||
|
||||
## 缓存一致性
|
||||
### 缓存一致性
|
||||
|
||||
缓存一致性要求数据更新的同时缓存数据也能够实时更新。
|
||||
|
||||
@ -115,7 +109,7 @@ CDN 主要有以下优点:
|
||||
|
||||
要保证缓存一致性需要付出很大的代价,缓存数据最好是那些对一致性要求不高的数据,允许缓存数据存在一些脏数据。
|
||||
|
||||
## 缓存 “无底洞” 现象
|
||||
### 缓存 “无底洞” 现象
|
||||
|
||||
指的是为了满足业务要求添加了大量缓存节点,但是性能不但没有好转反而下降了的现象。
|
||||
|
||||
@ -127,15 +121,15 @@ CDN 主要有以下优点:
|
||||
- 减少网络通信次数;
|
||||
- 降低接入成本,使用长连接 / 连接池,NIO 等。
|
||||
|
||||
# 五、数据分布
|
||||
## 五、数据分布
|
||||
|
||||
## 哈希分布
|
||||
### 哈希分布
|
||||
|
||||
哈希分布就是将数据计算哈希值之后,按照哈希值分配到不同的节点上。例如有 N 个节点,数据的主键为 key,则将该数据分配的节点序号为:hash(key)%N。
|
||||
|
||||
传统的哈希分布算法存在一个问题:当节点数量变化时,也就是 N 值变化,那么几乎所有的数据都需要重新分布,将导致大量的数据迁移。
|
||||
|
||||
## 顺序分布
|
||||
### 顺序分布
|
||||
|
||||
将数据划分为多个连续的部分,按数据的 ID 或者时间分布到不同节点上。例如 User 表的 ID 范围为 1 \~ 7000,使用顺序分布可以将其划分成多个子表,对应的主键范围为 1 \~ 1000,1001 \~ 2000,...,6001 \~ 7000。
|
||||
|
||||
@ -144,11 +138,11 @@ CDN 主要有以下优点:
|
||||
- 能保持数据原有的顺序;
|
||||
- 并且能够准确控制每台服务器存储的数据量,从而使得存储空间的利用率最大。
|
||||
|
||||
# 六、一致性哈希
|
||||
## 六、一致性哈希
|
||||
|
||||
Distributed Hash Table(DHT) 是一种哈希分布方式,其目的是为了克服传统哈希分布在服务器节点数量变化时大量数据迁移的问题。
|
||||
|
||||
## 基本原理
|
||||
### 基本原理
|
||||
|
||||
将哈希空间 [0, 2<sup>n</sup>-1] 看成一个哈希环,每个服务器节点都配置到哈希环上。每个数据对象通过哈希取模得到哈希值之后,存放到哈希环中顺时针方向第一个大于等于该哈希值的节点上。
|
||||
|
||||
@ -158,7 +152,7 @@ Distributed Hash Table(DHT) 是一种哈希分布方式,其目的是为了
|
||||
|
||||
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/66402828-fb2b-418f-83f6-82153491bcfe.jpg"/> </div><br>
|
||||
|
||||
## 虚拟节点
|
||||
### 虚拟节点
|
||||
|
||||
上面描述的一致性哈希存在数据分布不均匀的问题,节点存储的数据量有可能会存在很大的不同。
|
||||
|
||||
@ -166,7 +160,7 @@ Distributed Hash Table(DHT) 是一种哈希分布方式,其目的是为了
|
||||
|
||||
解决方式是通过增加虚拟节点,然后将虚拟节点映射到真实节点上。虚拟节点的数量比真实节点来得多,那么虚拟节点在哈希环上分布的均匀性就会比原来的真实节点好,从而使得数据分布也更加均匀。
|
||||
|
||||
# 七、LRU
|
||||
## 七、LRU
|
||||
|
||||
以下是基于 双向链表 + HashMap 的 LRU 算法实现,对算法的解释如下:
|
||||
|
||||
@ -299,17 +293,10 @@ public class LRU<K, V> implements Iterable<K> {
|
||||
}
|
||||
```
|
||||
|
||||
# 参考资料
|
||||
## 参考资料
|
||||
|
||||
- 大规模分布式存储系统
|
||||
- [缓存那些事](https://tech.meituan.com/cache_about.html)
|
||||
- [一致性哈希算法](https://my.oschina.net/jayhu/blog/732849)
|
||||
- [内容分发网络](https://zh.wikipedia.org/wiki/%E5%85%A7%E5%AE%B9%E5%82%B3%E9%81%9E%E7%B6%B2%E8%B7%AF)
|
||||
- [How Aspiration CDN helps to improve your website loading speed?](https://www.aspirationhosting.com/aspiration-cdn/)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div align="center"><img width="320px" src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/githubio/公众号二维码-2.png"></img></div>
|
||||
|
Reference in New Issue
Block a user