质量为本、客户为根、勇于拼搏、务实创新
减少服务器负载
动态数据(如数据库查询结果、API 接口返回值)经缓存后,重复请求可直接从内存或磁盘读取,避免重复执行 SQL 查询、业务逻辑计算,降低 CPU 和数据库压力。
加速响应速度
内存缓存(如 Memcached、Redis)的读写速度可达每秒 10 万次以上,比数据库查询快 10-100 倍,尤其适合高并发场景(如电商大促、新闻资讯平台)。
降低带宽消耗
静态资源(图片、CSS、JS)缓存至客户端或 CDN 后,后续访问无需重复从源服务器拉取,减少带宽成本(尤其对流量型业务至关重要)。
原理:通过 HTTP 响应头(Cache-Control
、Expires
、ETag
)控制浏览器缓存静态资源,下次访问直接从本地读取。
配置示例(Nginx):
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires 7d; # 资源缓存7天 add_header Cache-Control "public";}
适用场景:静态资源(如官网图片、样式文件),减少客户端重复请求。
原理:将资源分发至各地的 CDN 节点,用户就近获取,降低源站压力(尤其适合跨国业务)。
配置方式:在 CDN 服务商(如阿里云 CDN、Cloudflare)后台设置缓存规则,指定文件类型和过期时间。
适用场景:图片、视频、HTML 等静态资源,解决跨地域访问慢的问题。
Nginx FastCGI 缓存配置:
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=fcgi_cache:100m max_size=10g;server { location / { fastcgi_cache fcgi_cache; fastcgi_cache_valid 200 302 1h; // 200/302状态码缓存1小时 fastcgi_cache_valid 404 1m; // 404页面缓存1分钟 ... }}
示例(PHP+Redis):
// 缓存数据库查询结果1小时$key = "user_data_123";$data = $redis->get($key);if (!$data) { $data = $db->query("SELECT * FROM users WHERE id=123"); $redis->set($key, $data, 3600); // 缓存3600秒}
应用层缓存:如 PHP、Java 等程序通过缓存框架(如 Redis、Memcached)存储业务数据。
Web 服务器缓存:Nginx、Apache 通过模块缓存动态请求结果。
适用场景:动态数据(如用户列表、商品详情)、高频访问的 API 接口。
原理:数据库自身缓存(如 MySQL 的 InnoDB Buffer Pool)或中间件(如 MyCAT、Redis+MySQL 主从)缓存热数据。
配置示例(MySQL):
-- 调整InnoDB缓冲池大小(建议为物理内存的50%-70%)SET GLOBAL innodb_buffer_pool_size = 10737418240; # 10GB
适用场景:高并发读写的数据库表(如订单表、用户表)。
内存缓存(如 Memcached、Redis)
优势:速度极快(纳秒级响应),适合缓存高频访问的热数据(如用户会话、商品库存)。
缺点:数据易失性(重启后丢失),需配合持久化(如 Redis 的 RDB/AOF)或主从复制。
磁盘缓存(如 Nginx 本地缓存、文件缓存)
优势:容量大、成本低,适合缓存低频访问但需持久化的数据(如日志文件、临时文件)。
缺点:速度比内存慢(毫秒级响应),适合对实时性要求不高的场景。
避免 “大而全” 的缓存:例如电商详情页可拆分缓存(商品基本信息、价格、评论分开缓存),更新时仅刷新部分数据。
示例:商品价格变动时,仅刷新价格相关缓存,保留图片、描述等不变数据。
主动过期:设置合理的expire time
(如热点数据缓存 10 分钟,低频数据缓存 1 天)。
被动更新:通过 “缓存击穿” 策略(如加互斥锁)避免大量请求同时击穿缓存:
// 加锁防止缓存击穿$lockKey = "lock_user_123";if ($redis->setnx($lockKey, 1)) { // 加锁成功 $data = $redis->get("user_123"); if (!$data) { $data = $db->query(...); $redis->set("user_123", $data, 3600); } $redis->del($lockKey); // 释放锁} else { // 等待片刻重试或返回旧数据 sleep(0.1); return get_user_data(123); // 递归重试}
预热:上线前通过脚本将热点数据提前写入缓存(如大促前缓存热门商品信息),避免首访击穿。
降级:缓存服务故障时,切换至数据库直连或返回默认数据,服务可用性(如使用 Hystrix 等熔断框架)。
给缓存过期时间添加随机偏移(如3600+rand(0, 600)
秒),避免集中失效;
启用多级缓存(如本地缓存 + Redis 缓存),降低源站压力。
现象:大量缓存同时过期,导致瞬时流量全部压向数据库,引发服务器崩溃。
解决方案:
对不存在的数据也缓存(值为null
,过期时间设为 5-10 分钟);
接口层添加参数校验(如 ID 必须为正整数),过滤非法请求。
现象:恶意请求频繁查询不存在的数据(如id=-1
),每次都穿透缓存直达数据库。
解决方案:
使用 Redis 的maxmemory-policy
设置内存淘汰策略(如volatile-lru
淘汰近少使用的缓存);
定期清理低频缓存(如通过定时任务删除 7 天未访问的键)。
解决方案:
缓存工具:
内存缓存:Redis(支持数据持久化、复杂数据结构)、Memcached(轻量,适合简单 KV 存储);
分布式缓存:Elasticache(AWS)、Redis Cluster(主从 + 分片,支持高可用)。
性能监控:
通过top
、free -m
监控服务器内存使用;
使用 Redis 的INFO
命令查看缓存命中率(理想情况hit rate
应 > 90%);
通过 Nginx 的stub_status
模块查看缓存命中情况:
location /status { stub_status on; access_log off; allow 127.0.0.1; # 仅允许本地访问 deny all;}
数据实时性:如金融交易数据需低缓存时间(甚至不缓存),资讯内容可延长缓存;
硬件成本:内存缓存成本高,可采用 “热数据 + 内存”+“冷数据 + 磁盘” 的分级策略;
维护复杂度:分布式缓存需考虑数据一致性(如 Redis 主从延迟),简单场景优先使用单机缓存。
通过合理的缓存策略,可将服务器 QPS(每秒请求数)提升 3-5 倍,同时降低 50% 以上的数据库负载,是性能优化的 “必选项”。
(声明:本文来源于网络,仅供参考阅读,涉及侵权请联系我们删除、不代表任何立场以及观点。)
Copyright © 2021 贵州机房-贵州IDC-贵州数据中心-贵州服务器租用-贵州服务器托管-南数网络 版权所有 黔ICP备2021003817号-1