缓存架构
通读缓存
应用程序访问通读缓存获取数据的时候,如果通读缓存有应 用程序需要的数据,那么就返回这个数据;如果没有,那么通读缓存就自己负责访问数据 源,从数据源获取数据返回给应用程序,并将这个数据缓存在自己的缓存中。这样,下次应 用程序需要数据的时候,就可以通过通读缓存直接获得数据了。
CDN
即内容分发网络。CDN 只能缓存静态数据内容
反向代理缓存
既然所有的请求都需要通过反向代 理才能到达应用服务器,那么在这里加一个缓存,尽快将数据返回给用户,而不是发送给应 用服务器,这就是反向代理缓存。
旁路缓存
应用程序访问旁路缓存获取数据的时候,如果旁路缓存中有应 用程序需要的数据,那么就返回这个数据;如果没有,就返回空(null)。应用程序需要自 己从数据源读取数据,然后将这个数据写入到旁路缓存中。这样,下次应用程序需要数据的 时候,就可以通过旁路缓存直接获得数据了。
对象缓存
一种是本地缓存,缓存和应用程序在同一个进程中 启动,使用程序的堆空间存放缓存数据。本地缓存的响应速度快,但是缓存可以使用的内存 空间相对比较小,但是对于大型互联网应用所需要缓存的数据通以 T 计,这时候就要使用 远程的分布式缓存了。
缓存注意事项
好处:
-
缓存的数据通常存储在内存中,距离使用数据的应用也更近一点,因此相比从硬盘上获 取,或者从远程网络上获取,它获取数据的速度更快一点,响应时间更快,性能表现更 好。
-
缓存的数据通常是计算结果数据,比如对象缓存中,通常存放经过计算加工的结果对 象,如果缓存不命中,那么就需要从数据库中获取原始数据,然后进行计算加工才能得 到结果对象,因此使用缓存可以减少 CPU 的计算消耗,节省计算资源,同样也加快了处 理的速度。
-
通过对象缓存获取数据,可以降低数据库的负载压力;通过 CDN、反向代理等通读缓存 获取数据,可以降低服务器的负载压力。这些被释放出来的计算资源,可以提供给其他 更有需要的计算场景,比如写数据的场景,间接提高整个系统的处理能力。
问题:
数据脏读
解决办法:
- 过期失效
- 失效通知: 应用程序更新数据源的数据,同时发送通知,将该数据从缓存中 清除。失效通知看起来数据更新更加及时,但是实践中,更多使用的还是过期失效。
如果缓存的数据没有热点,写入缓存的数据很难被重复读取,那么使用缓存就不是很 有必要了。