Web开发系列(七):缓存,CDN

缓存

如果有一个GET请求,每秒钟有10k请求,但是10s钟才需要刷新一次,你会让内容服务器不停地处理这类请求吗? 不会,这10秒内的100k次请求带来的计算都是毫无意义的,浪费了CPU资源,并且还可能为内容服务器之后的数据库 带来了不必要的压力。所以我们需要引入一个概念:缓存。

我们在每次处理请求之前,检查一下内存中是否已经产生了结果,如果是,那么直接返回结果,否则,计算,返回结果并且 同时将结果放入内存中以便重复利用。这显然已经不是和计算机操作系统级别的缓存是同一个概念了,web开发中的缓存 通常是指对静态资源,请求响应等的存储以便节省CPU资源。

在实际生产中,我们一般使用Redis作为缓存容器,Redis是一个高性能的K-V数据库,我们把缓存定义好一个key,内容则 放在value中,通常我们还会为key设置过期时间,这样再通过上面的手段便可以大量的节省内容服务器的无用计算。在Redis 火爆之前,一般都会使用memcached,不过我没有用过。

CDN

如果你的客户,或者说请求来源于全球,但是你的网站服务器只在中国有,那么来自美国的用户可能会感觉请求非常的慢, 因为网络质量的问题,一个网络请求可能要跨越太平洋来到中国,带上服务器给出的响应回去。那么有没有什么好办法可以让 全球的用户都得到最快的响应呢?有,把你的服务器部署到全球各个地方,然后通过DNS做负载均衡,解析到最近的服务器, 这样全球的用户的请求都会打到离他最近的地方。这种技术就叫CDN。

一般情况下CDN服务器都会缓存住源服务器的响应,并且定时刷新。但是CDN仅限于可以缓存的内容例如变化不频繁的网页, 如果是频繁变化,或者每个请求得到的响应都不一样,则不适用,例如面向APP或者前端的API接口响应。

参考:


更多文章
  • 读《格鲁夫给经理人的第一课》
  • 读《打开心智》
  • 为什么要把复杂的联表操作拆成多个单表查询?
  • 红包系统的设计
  • 2022年终总结
  • MySQL Index Condition Pushdown Optimization
  • Go mod 简明教程
  • OpenWRT 使用 Android/iOS USB 网络
  • 搭建旁路由
  • Golang gRPC 错误处理
  • 编写可维护的单元测试代码
  • OAuth 2 详解(六):Authorization Code Flow with PKCE
  • OAuth 2 详解(五):Device Authorization Flow
  • OAuth 2 详解(三):Resource Owner Password Credentials Grant
  • OAuth 2 详解(四):Client Credentials Flow