多级缓存

多级缓存图中分为4层 客户端 应用层 服务层 数据层

客户端缓存

再浏览器主要是对html中图片,css,字体这些静态资源进行缓存

以百度为例,百度通过expires控制图片的有效期,有效期之前浏览器访问会直接从本地缓存读取,而不进行访问

应用层缓存

分布式缓存技术,cdn分发网络

只能DNS,会根据用户的ip自动就近访问cdn节点

cdn涉及多域多节点的组网因此投入成本很高,因此中小公司基本上以租用云服务器的cdn服务为多

再cdn中还可以为其设置缓存的属性,比如Cache-Control/Expires

expires指定具体哪个时间点过去,Cache-Control是设置的时长

nginx缓存管理

nginx使用缓存时只需要在他的配置文件增加片段就可以对静态资源进行缓存

服务层缓存

进程内缓存

再应用中开辟一段内存空间数据在运行时被载入到这块内存中,通过本地内存的低延迟高吞吐特性,提高程序的访问速度

比如hibernate,mybatis的1,2级缓存,springmvc的页面缓存都是进程内缓存的代表

分布式的缓存服务最常见的就是部署redis这样的数据库,对整体架构中的应用数据进行集中缓存

不应该把所有缓存都放在redis中,这样redis挂了所有服务都挂了,而且redis读写有不小的网络开销

我们应用中也应该存在对应的缓存

和分布式缓存相结合

在java应用封面只有ehcache缓存不存在的情况下,才去redis读取,如果redis没有这个数据,再去数据库查询,查询成功后对ehcache和redis进行双写更新,这样下一次java应用查询系统数据的时候,就直接从进程内的本地内存中进行提取,不同产生网络通信

但是在数据更新是又带来了麻烦

最常见的做法是我们只需要在当前的架构中引入mq,利用mq的主动推送的功能,向其他的服务主动推送这些数据.

这些服务收到消息后,在缓存中,先将这些缓存删除,然后进行重新创建,来保证各实例的一致

摘录自https://www.bilibili.com/video/BV1Lq4y1975x/

需要缓存的情况

  1. 缓存的数据是稳定的
  2. 瞬时可能会产生极高并发的场景
  3. 一定程度上允许数据不一致
Last modification:August 25, 2023
如果觉得我的文章对你有用,请随意赞赏