02-高并发读架构详解
高并发读架构详解一、知识概述高并发读是互联网应用最常见的性能挑战,典型场景包括新闻资讯、商品详情、社交动态等。核心目标是用最小的成本支持最大的读流量。核心指标:QPS:1万 - 100万+响应时间:P99 50ms成本控制:单请求成本 0.001元典型特征:读多写少(读写比可达 100:1)数据相对稳定(非实时性要求)可容忍一定延迟(最终一致性)二、知识点详细讲解2.1 多级缓存架构2.1.1 缓存层次设计┌────────────────────────────────────────────────────────┐ │ 浏览器缓存 │ │ (强缓存 Cache-Control / 协商缓存 ETag) │ │ 命中率: 30-50% | 延迟: 0ms │ └──────────────────────┬─────────────────────────────────┘ ↓ ┌────────────────────────────────────────────────────────┐ │ CDN边缘缓存 │ │ (静态资源 / 动态加速 / 边缘计算) │ │ 命中率: 80-95% | 延迟: 10-50ms │ └──────────────────────┬─────────────────────────────────┘ ↓ ┌────────────────────────────────────────────────────────┐ │ 负载均衡缓存 │ │ (Nginx proxy_cache / OpenResty) │ │ 命中率: 60-80% | 延迟: 1-5ms │ └──────────────────────┬─────────────────────────────────┘ ↓ ┌────────────────────────────────────────────────────────┐ │ 应用本地缓存 │ │ (Guava Cache / Caffeine / ConcurrentHashMap) │ │ 命中率: 50-70% | 延迟: 0.1ms │ └──────────────────────┬─────────────────────────────────┘ ↓ ┌────────────────────────────────────────────────────────┐ │ 分布式缓存 │ │ (Redis Cluster / Memcached) │ │ 命中率: 90-95% | 延迟: 1-5ms │ └──────────────────────┬─────────────────────────────────┘ ↓ ┌────────────────────────────────────────────────────────┐ │ 数据库 │ │ (MySQL主从 / 分库分表) │ │ 延迟: 5-50ms │ └────────────────────────────────────────────────────────┘2.1.2 缓存命中率优化/** * 多级缓存管理器 */@ServicepublicclassMultiLevelCacheManager{// L1: 本地缓存(Caffeine,最快)privatefinalCacheString,CacheValuelocalCache=Caffeine.newBuilder().maximumSize(10000).expireAfterWrite(5,TimeUnit.MINUTES).recordStats()// 开启统计.build();// L2: 分布式缓存(Redis)@AutowiredprivateRedisTemplateString,ObjectredisTemplate;// L3: 数据库@AutowiredprivateProductMapperproductMapper;/** * 多级缓存读取 */publicProductgetProduct(LongproductId){Stringkey="product:"+productId;// L1: 本地缓存CacheValuelocalValue=localCache.getIfPresent(key);if(localValue!=null!localValue.isExpired()){returnlocalValue.getProduct();}// L2: Redis缓存ProductredisValue=(Product)redisTemplate.opsForValue().get(key);if(redisValue!=null){// 回填L1localCache.put(key,newCacheValue(redisValue,300));returnredisValue;}// L3: 数据库(需要分布式锁防止缓存击穿)ProductdbValue=getProductFromDB(productId);if(dbValue!=null){// 回填L1和L2localCache.put(key,newCacheValue(dbValue,300));redisTemplate.opsForValue().set(key,dbValue,30,TimeUnit.MINUTES);}returndbValue;}/** * 缓存统计 */publicCacheStatsgetStats(){CacheStatsstats=localCache.stats();returnCacheStats.builder().localHitRate(stats.hitRate()).localEvictionCount(stats.evictionCount()).build();}}2.2 CDN加速策略2.2.1 CDN配置最佳实践# Nginx CDN配置示例 server { listen 80; server_name cdn.example.com; # 静态资源缓存 location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ { expires 30d; add_header Cache-Control "public, immutable"; # CDN回源设置 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_cache_valid 200 30d; } # 动态接口CDN加速 location /api/ { # 短缓存(秒级) expires 10s; add_header Cache-Control "public, max-age=10"; # 禁用缓存条件(用户相关) if ($http_cookie ~ "user_token") { add_header Cache-Control "no-cache, no-store"; } proxy_pass http://backend; } }2.2.2 CDN预热与刷新/** * CDN管理服务 */@ServicepublicclassCDNService{@Value("${cdn.provider}")privateStringcdnProvider;// aliyun/tencent/qiniu/** * CDN预热 - 提前推送内容到边缘节点 */publicvoidpreload(ListStringurls){switch(cdnProvider){case"aliyun":aliyunPreload(urls);break;case"tencent":tencentPreload(urls);break;}}/** * CDN刷新 - 强制更新缓存 */publicvoidrefresh(ListStringurls){// 场景:商品价格变更、紧急公告等cdnClient.refreshUrls(urls);}/** * 阿里云CDN预热示例 */privatevoidaliyunPreload(ListStringurls){DefaultAcsClientclient=newDefaultAcsClient(profile);PushObjectCacheRequestrequest=newPushObjectCacheRequest