IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

缓存那些事

也就这样, 2017-03-11 23:48:21 累计浏览 1,830 次
本机暂存

浏览器缓存头

If-Modified-Since

具体可以查看这篇文章中的附件 媒体中心设计分享

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. 缓存过期失效

  2. 不存在的数据

  3. 缓存宕机

对于场景1,为避免瞬时流量将db和缓存击垮,可以使用一个锁,保证并发环境下,只有1个/少量线程写入同一条数据
对于场景2,可以使用empty object,在存取缓存的时候将其替换为null,如果为了池子中有效数据留存率,可以将empty object和正常数据分开存放
对于场景3,需事先脱离缓存,db裸压,保证在没有缓存的情况之后可以正常支持线上的流量 (可忍受的RT内)

pjax

对页面的局部更新,不过会将当前url塞到浏览器的历史记录中

具体可以查看这篇文章:slim框架中pjax的实现

bigpipe

利用服务器端的输出缓存,输出部分页面

缓存优化

在一台机器存不下1个业务所有缓存的时候,一般都会选择分片的策略(大多采用取模的办法),但有的时候缩减单个缓存对象的大小,也可以节省整个池子的资源

  1. 一般情况之下,key的重复度很高,可以选择缩减key的长度

  2. 在序列化的时候选择创建slim object,然后JSON.toJSONString()

  3. 使用gz/br压缩JSONString (考虑平滑兼容多种压缩方式,使用第一个字节作为标志位)

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 让Redis使用TCMalloc,实现高性能NOSql服务器 (累计阅读 7,347)
  2. 如何编写一个JSON解析器 (累计阅读 6,363)
  3. Linux 64位, MySQL, Swap & Memory 优化 (累计阅读 5,670)
  4. Nginx使用Linux内存加速静态文件访问 (累计阅读 4,922)
  5. redis内存容量的预估和优化 (累计阅读 3,836)
  6. 一种比较省内存的稀疏矩阵Python存储方案 (累计阅读 3,185)
  7. 深入剖析 redis 数据结构 ziplist (累计阅读 2,739)
  8. 关于大区间过滤优化内存设计 (累计阅读 2,700)
  9. Android APP内存优化之图片优化 (累计阅读 1,450)