# 缓存

{% hint style="success" %} <mark style="color:orange;">**在复杂的软件设计中，缓存几乎无处不在。**</mark>

网站应用中，缓存除了可以<mark style="color:blue;">**加快数据访问速度**</mark>，还可以<mark style="color:blue;">**减轻后端应用和数据存储的负载压力**</mark>
{% endhint %}

<mark style="color:blue;">**CDN**</mark>：即<mark style="color:blue;">**内容分发网络**</mark>，部署在距离终端用户最近的<mark style="color:blue;">**网络服务提供商**</mark>，用户的网络请求总是先到达他的网络服务商那里，在这里缓存网站的一些静态资源（较少变化的数据），可以就近以最快速度返回给用户，如视频网站和门户网站会将用户访问量大的<mark style="color:purple;">**热点内容**</mark>缓存在 CDN。

<mark style="color:blue;">**反向代理**</mark>：反向代理属于网站前端架构的一部分，部署在网站的前端，**当用户请求到达网站的数据中心时，最先访问到的就是反向代理服务器，这里缓存网站的**<mark style="color:purple;">**静态资源**</mark>，无需将请求继续转发给应用服务器就能返回给用户。

<mark style="color:blue;">**本地缓存**</mark>：在应用服务器本地缓存着<mark style="color:purple;">**热点数据**</mark>，应用程序可以在**本机内存中**直接访问数据，而无需访问数据库。

<mark style="color:blue;">**分布式缓存**</mark>：大型网站的数据量非常庞大，即使只缓存一小部分，需要的内存空间也不是单机能承受的，所以除了本地缓存，还需要分布式缓存，**将数据缓存在一个专门的分布式缓存集群中**，应用程序通过网络通信访问缓存数据。

{% hint style="warning" %}

## <mark style="color:orange;">注意</mark>

使用缓存有两个前提条件：

* 一是<mark style="color:orange;">**数据访问热点不均衡**</mark>，某些数据会被更频繁的访问，这些数据应该放在缓存中；
* 二是<mark style="color:orange;">**数据在某个时间段内有效，不会很快过期**</mark>，否则缓存的数据就会因已经失效而产生脏读，影响结果的正确性。
  {% endhint %}
