缓存那些事
浏览器缓存头
If-Modified-Since
If-None-Match
Last-Modified
Cache-Control
ETagExpires
具体可以查看这篇文章中的附件 媒体中心设计分享
varnish / apache traffic server -> cdn
CSI: 指利用ajax等技术,将动态的数据使用异步的方式加载进页面 (比较适用于PC, H5)
SSI: 通常url后缀为shtml
ESI: 最具代表性的 varnish/ats (比较适用于App的接口)
具体可以查看这篇文章:页面静态化
上面的几种方案都需要走到后端的服务器,在并发和加载速度要求比较高的情况下,可以选择生成静态文件上传到cdn
local cache, redis, tair
多级缓存可以降低中心缓存服务器的压力,但是也会存在数据不一致的问题
当当网交易链路:简单的将local cache的过期时间设置为1分钟,降低缓存不一致的概率 (适用于一致性要求不高的情景)
缓存击穿的几种场景:
缓存过期失效
不存在的数据
缓存宕机
对于场景1,为避免瞬时流量将db和缓存击垮,可以使用一个锁,保证并发环境下,只有1个/少量线程写入同一条数据
对于场景2,可以使用empty object,在存取缓存的时候将其替换为null,如果为了池子中有效数据留存率,可以将empty object和正常数据分开存放
对于场景3,需事先脱离缓存,db裸压,保证在没有缓存的情况之后可以正常支持线上的流量 (可忍受的RT内)
pjax
对页面的局部更新,不过会将当前url塞到浏览器的历史记录中
具体可以查看这篇文章:slim框架中pjax的实现
bigpipe
利用服务器端的输出缓存,输出部分页面
缓存优化
在一台机器存不下1个业务所有缓存的时候,一般都会选择分片的策略(大多采用取模的办法),但有的时候缩减单个缓存对象的大小,也可以节省整个池子的资源
一般情况之下,key的重复度很高,可以选择缩减key的长度
在序列化的时候选择创建slim object,然后JSON.toJSONString()
使用gz/br压缩JSONString (考虑平滑兼容多种压缩方式,使用第一个字节作为标志位)
建议继续学习:
- 浅析http协议、cookies和session机制、浏览器缓存 (阅读:15758)
- 分布式缓存系统 Memcached 入门 (阅读:14701)
- 强制刷新本地 DNS 缓存记录 (阅读:9224)
- php缓存与加速分析与汇总 (阅读:6248)
- Web应用的缓存设计模式 (阅读:5853)
- 浏览器缓存机制 (阅读:5754)
- 缓存设计的一些思考 (阅读:5707)
- 谈冷热数据 (阅读:5731)
- 使用memc-nginx和srcache-nginx构建高效透明的缓存机制 (阅读:5687)
- 系统架构的一些思考 (阅读:5590)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:小子 来源: 也就这样,
- 标签: 缓存
- 发布时间:2017-03-11 23:48:21
- [67] Go Reflect 性能
- [67] Oracle MTS模式下 进程地址与会话信
- [67] 如何拿下简短的域名
- [61] IOS安全–浅谈关于IOS加固的几种方法
- [60] 图书馆的世界纪录
- [59] 【社会化设计】自我(self)部分――欢迎区
- [58] android 开发入门
- [56] 视觉调整-设计师 vs. 逻辑
- [49] 给自己的字体课(一)——英文字体基础
- [47] 界面设计速成