多级缓存设计
整理一下实际工程中用到过的一些缓存,从客户端到服务端。
文章目录
1. 客户端缓存
页面缓存
- HTML5中使用本地缓存localStorage
- 开启离线缓存步骤:1. 准备资源列表清单文件;2. 页面中添加manifest属性,指定缓存清单文件的路径
浏览器缓存
- 浏览器与服务器约定的规则
APP上的缓存
- APP可以将内容缓存在内存、文件或本地数据库中
- 数据库缓存方法:存放文件相关信息(URL、路径、下载时间、过期时间),需要注意清理机制。
- IOS开发中,SDWebImage-图片缓存框架
2. CDN
- 将图片、JS、音频等放在CDN上,能提高访问速度、降低成本、也提高了系统的吞吐量。笔者就遇到过一次因为某个活动页面的图片链接没有替换成CND链接,用了应用内链接,上线直接冲垮网站的情况。
CDN方案
- 国内很多CDN厂商
- Amazon CloudFront,不过看了下cn区的还没有这个服务。
3. 接入层缓存,Nginx
- Nginx能有效地直接处理静态内容,适合给前端服务器当缓存。
Nginx 缓存配置
- 在http配置快中添加proxy_cache_path,配置缓存所在文件系统路径、缓存区名称、大小。
- 配置proxy_cache
- 一个简单的中文参考: https://leokongwq.github.io/2016/11/25/nginx-cache.html
4. 应用层缓存
4.1 堆内缓存
- Guava cache, 简单易用
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
private final LoadingCache<String, Product> productCache = CacheBuilder.newBuilder()
.softValues()
.expireAfterWrite(TimeUtils.FIVE_MINUTE_IN_SECONDS, TimeUnit.SECONDS)
.build(
new CacheLoader<String, Product>() {
@Override
public Product load(String productId) throws Exception {
return productDao.getByProductId(productId);
}
}
);
4.2 堆外缓存
Ehcache的 BigMemory
4.3 本地磁盘缓存
local redis cache
4.4 分布式缓存
Redis
- 需要学习的内容有很多,包括常用命令、数据结构、主从复制、持久化、高可用、集群、扩容、内存管理、集群监控等
Memcached
- 包括 安装使用、内存管理、缓存策略、分布式集群、分布式算法等
5. 数据库缓存
MySQL查询缓存
查看 Query Cache 是否合理
- SHOW VARIABLES LIKE '%query_cache%'
- SHOW STATUS LIKE '%cache%'
InnoDB 缓存性能
- SHOW VARIABLES LIKE '%innodb_buffer_pool%'
- SHOW STATUS LIKE '%innodb_buffer_pool_read%'
- 缓存命中率: (Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads)/Innodb_buffer_pool_read_requests*100%
- 根据命中率调节innodb_buffer_pool_size
大型网站的系统架构示意图
前端页面缓存
→ Web服务器集群
→ 分布式文件系统
→ 动态页面组件缓存
→ 数据库接入层 → 数据库集群
→ 数据缓存、分布式缓存