缓存设计/CDN
2019-02-11 本文已影响0人
suxin1932
1. 缓存设计的基本思路
1.1 多级缓存设计框架
基本思路: 静态资源缓存 + 动态接口缓存
#静态资源缓存
>> 浏览器/客户端缓存 (HTTP 缓存)
>> CDN缓存
>> nginx缓存
#动态接口缓存
>> redis缓存
>> tomcat服务端缓存(本地缓存, 如ehcache, guava, caffine缓存)
>> DB(数据库)缓存
缓存分级的基本思路.png
1.2 缓存同步方案
1.2.1 方案1
使用消息中间件(如kafka)或本地异步任务完成本地缓存ehcache/guava/caffine的数据同步 -->
更新数据库时, 同步写入redis及本地缓存
1.2.2 方案2
使用一个定时任务, 定时从数据库等地方拉取信息, 更新缓存
#适用于对数据实时性要求不高的场景
2.CDN
2.1访问原理
CDN原理.png用户输入访问的域名,操作系统向 LocalDns 查询域名的ip地址.
LocalDns向 ROOT DNS 查询域名的授权服务器(这里假设LocalDns缓存过期)
ROOT DNS将域名授权dns记录回应给 LocalDns
LocalDns得到域名的授权dns记录后,继续向域名授权dns查询域名的ip地址
域名授权dns 查询域名记录后(一般是CNAME),回应给 LocalDns
LocalDns 得到域名记录后,向智能调度DNS查询域名的ip地址
智能调度DNS 根据一定的算法和策略(比如静态拓扑,容量等),将最适合的CDN节点ip地址回应给 LocalDns
LocalDns 将得到的域名ip地址,回应给 用户端
用户得到域名ip地址后,访问站点服务器
CDN节点服务器应答请求,将内容返回给客户端.(缓存服务器一方面在本地进行保存,以备以后使用,二方面把获取的数据返回给客户端,完成数据服务过程)
2.2概念
2.2.1回源
当用户访问某个url时, 若被解析到的那个CDN节点没有资源, 就会回源站去取. 若无人访问, CDN节点不会主动去源站拿资源
2.2.2CDN预热与刷新
CDN预热/预缓存
CDN刷新/清理缓存
2.2.3适用场景
视频, 短视频, 直播, 图片以及国际项目等加速
2.2.4业务设计
web server上传资源A到 --> file server --> 分发到 --> CDN站点 --> user下载资源A
3.缓存相关概念
3.1缓存穿透
当大量请求过来时, 若缓存中没有相应的Key-value, 将会直接查询数据库, 给数据库过大压力
对应方案:
将数据库中没有查到结果的结果, 也缓存起来, 将缓存时间短些即可
3.2缓存雪崩
同一时间, 大面积key失效, 从而导致db服务器的CPU内存负载过多, 从而可能导致宕机
对应方案:
a.为避免同时失效, 将缓存生存时间, 在一定范围内随机
b.对缓存限流
3.3缓存预热
即某个数据入库时, 写入缓存库
3.4热key重建优化
加锁, 永不过期, 降级处理