多級緩存設計的學習筆記
整理一下實際工程中用到過的一些緩存,從客戶端到服務端。
文章目錄
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服務器集羣
→ 分佈式文件系統
→ 動態頁面組件緩存
→ 數據庫接入層 → 數據庫集羣
→ 數據緩存、分佈式緩存