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接口响应。
参考:
更多文章
本站热门
- socks5 协议详解
- zerotier简明教程
- 搞定面试中的系统设计题
- frp 源码阅读与分析(一):流程和概念
- 用peewee代替SQLAlchemy
- Golang(Go语言)中实现典型的fork调用
- DNSCrypt简明教程
- 一个Gunicorn worker数量引发的血案
- Golang validator使用教程
- Docker组件介绍(二):shim, docker-init和docker-proxy
- Docker组件介绍(一):runc和containerd
- 使用Go语言实现一个异步任务框架
- 协程(coroutine)简介 - 什么是协程?
- SQLAlchemy简明教程
- Go Module 简明教程