# 缓存架构


## 通读缓存
应用程序访问通读缓存获取数据的时候，如果通读缓存有应
用程序需要的数据，那么就返回这个数据；如果没有，那么通读缓存就自己负责访问数据
源，从数据源获取数据返回给应用程序，并将这个数据缓存在自己的缓存中。这样，下次应
用程序需要数据的时候，就可以通过通读缓存直接获得数据了。

### CDN
即内容分发网络。CDN 只能缓存静态数据内容
### 反向代理缓存
既然所有的请求都需要通过反向代
理才能到达应用服务器，那么在这里加一个缓存，尽快将数据返回给用户，而不是发送给应
用服务器，这就是反向代理缓存。

## 旁路缓存
应用程序访问旁路缓存获取数据的时候，如果旁路缓存中有应
用程序需要的数据，那么就返回这个数据；如果没有，就返回空（null）。应用程序需要自
己从数据源读取数据，然后将这个数据写入到旁路缓存中。这样，下次应用程序需要数据的
时候，就可以通过旁路缓存直接获得数据了。

### 对象缓存
一种是本地缓存，缓存和应用程序在同一个进程中
启动，使用程序的堆空间存放缓存数据。本地缓存的响应速度快，但是缓存可以使用的内存
空间相对比较小，但是对于大型互联网应用所需要缓存的数据通以 T 计，这时候就要使用
远程的分布式缓存了。
## 缓存注意事项
好处：
1. 缓存的数据通常存储在内存中，距离使用数据的应用也更近一点，因此相比从硬盘上获
取，或者从远程网络上获取，它获取数据的速度更快一点，响应时间更快，性能表现更
好。

2. 缓存的数据通常是计算结果数据，比如对象缓存中，通常存放经过计算加工的结果对
象，如果缓存不命中，那么就需要从数据库中获取原始数据，然后进行计算加工才能得
到结果对象，因此使用缓存可以减少 CPU 的计算消耗，节省计算资源，同样也加快了处
理的速度。

3. 通过对象缓存获取数据，可以降低数据库的负载压力；通过 CDN、反向代理等通读缓存
获取数据，可以降低服务器的负载压力。这些被释放出来的计算资源，可以提供给其他
更有需要的计算场景，比如写数据的场景，间接提高整个系统的处理能力。

问题：
### 数据脏读
解决办法：
1. 过期失效
2. 失效通知： 应用程序更新数据源的数据，同时发送通知，将该数据从缓存中
   清除。失效通知看起来数据更新更加及时，但是实践中，更多使用的还是过期失效。

**如果缓存的数据没有热点，写入缓存的数据很难被重复读取，那么使用缓存就不是很
有必要了。**
