缓存中间件

缓存设计/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重建优化

加锁, 永不过期, 降级处理

3.5缓存并发

4.redis

4.1spring版本实现

上一篇下一篇

猜你喜欢

热点阅读