目录

缓存架构

通读缓存

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

CDN

即内容分发网络。CDN 只能缓存静态数据内容

反向代理缓存

既然所有的请求都需要通过反向代 理才能到达应用服务器,那么在这里加一个缓存,尽快将数据返回给用户,而不是发送给应 用服务器,这就是反向代理缓存。

旁路缓存

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

对象缓存

一种是本地缓存,缓存和应用程序在同一个进程中 启动,使用程序的堆空间存放缓存数据。本地缓存的响应速度快,但是缓存可以使用的内存 空间相对比较小,但是对于大型互联网应用所需要缓存的数据通以 T 计,这时候就要使用 远程的分布式缓存了。

缓存注意事项

好处:

  1. 缓存的数据通常存储在内存中,距离使用数据的应用也更近一点,因此相比从硬盘上获 取,或者从远程网络上获取,它获取数据的速度更快一点,响应时间更快,性能表现更 好。

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

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

问题:

数据脏读

解决办法:

  1. 过期失效
  2. 失效通知: 应用程序更新数据源的数据,同时发送通知,将该数据从缓存中 清除。失效通知看起来数据更新更加及时,但是实践中,更多使用的还是过期失效。

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