如何在 CentOS 8 上实现多层级缓存系统,使用 Redis 与 Varnish 加速电商网站的产品页面加载与搜索
在高并发访问下,电商网站的产品详情页与搜索结果页往往是性能瓶颈所在。A5数据将基于 CentOS 8 环境,讲解如何设计与实现一个多层级缓存架构,结合 Varnish Cache 做前端 HTTP 缓存与 Redis 做业务数据缓存,从而显著提升页面渲染速度、减轻后端数据库压力,并提供具体参数、实现方法、配置示例及性能评估。
目标架构如下:
浏览器
↓
Varnish (HTTP 前端缓存)
↓
Nginx / 应用服务器(如 PHP‑FPM / Node.js)
↓
应用逻辑层
↙ ↘
Redis (业务缓存) MySQL / Elasticsearch (持久存储)
主要缓存层:
- Varnish Cache:针对静态及可缓存的动态 HTML 页面(产品页/搜索页)做 HTTP 缓存。
- Redis:存储结构化业务数据,例如产品详情对象、搜索结果集、推荐列表等,作为应用层缓存。
一、预备环境与硬件方案
以下为目标部署环境建议(针对中等规模电商平台):
| 组件 | 推荐配置 |
|---|---|
| 操作系统 | CentOS 8 x86_64 |
| CPU | 8 核 Intel Xeon / AMD EPYC |
| 内存 | 16 GB (Redis 使用 4–8 GB 预留) |
| 磁盘 | 500 GB NVMe SSD (索引/日志优化) |
| 网络 | 千兆(对外)/万兆(内部链路) |
| Redis 实例 | Redis 6.x(持久化可选 RDB/AOF 混合) |
| Varnish 版本 | Varnish 6.x |
| Web 服务器 | Nginx 1.18+ |
| 数据库 | MySQL 8 / MariaDB 10.5 |
| 搜索引擎 | Elasticsearch 7.x |
部署建议:香港服务器www.a5idc.com如访问高峰并发在 5k+ 级别,可将 Redis、Varnish、Web App 分布在独立服务器上;若并发更高,则针对 Redis 与 Varnish 做集群/分片。
二、安装与基础配置
2.1 安装 EPEL 与 Varnish
dnf install -y epel-release
dnf update -y
dnf install -y varnish
检查 Varnish 版本:
varnishd -V
输出预期如:
varnishd (varnish-6.6.1 revision 12345)
2.2 安装 Redis
CentOS 8 官方源提供 Redis 5.x;建议启用 remi 源安装较新 Redis 6.x:
dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf module enable -y redis:remi-6.2
dnf install -y redis
启动并设置开机自启:
systemctl enable --now redis
检查状态:
redis-cli ping
# 返回 PONG
三、Varnish 缓存策略与配置
3.1 监听端口修改
默认 Varnish 监听端口 6081,要让 Varnish 拦截 HTTP 流量:
编辑 /etc/varnish/varnish.params(CentOS 8 默认 systemd 启动参数):
VARNISH_LISTEN_PORT=80
VARNISH_STORAGE_SIZE=2G
3.2 配置 VCL 缓存规则
主配置文件:/etc/varnish/default.vcl
关键缓存逻辑示例:
vcl 4.1;
import std;
backend default {
.host = "127.0.0.1";
.port = "8080"; # 后端 Nginx
}
sub vcl_recv {
# 路径排除
if (req.url ~ "^/admin") {
return (pass);
}
# GET 允许缓存
if (req.method == "GET") {
return (hash);
}
}
sub vcl_backend_response {
# 缓存时间设置
if (bereq.url ~ "^/products/[0-9]+") {
set beresp.ttl = 10m;
}
if (bereq.url ~ "^/search") {
set beresp.ttl = 5m;
}
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}
说明:
- 产品页设置 10 分钟缓存;搜索页 5 分钟。
- 可根据访问热点与修改频率调整 TTL。
- 通过
X‑Cache响应头标记命中情况,便于监控。
四、Redis 缓存设计与应用集成
针对业务缓存,通常分别缓存:
| 缓存类型 | Key 设计 | TTL | 说明 |
|---|---|---|---|
| 产品详情 | product:<id> |
3600s (1h) | 产品详细信息 JSON 或哈希结构 |
| 搜索结果 | search:<query_hash> |
300s (5m) | 搜索关键词归一化后哈希作为 key |
| 推荐列表 | recommend:<user_id> |
600s (10m) | 个性化推荐缓存 |
4.1 Redis 数据结构示例
示例使用哈希存储产品详情:
redis-cli HMSET product:123 \
name "智能手表 A1" \
price 399.00 \
stock 234 \
images '["/img/1.jpg","/img/2.jpg"]'
获取:
redis-cli HGETALL product:123
4.2 应用层缓存代码(示例:PHP)
function getProductDetail($id, $redis, $db) {
$cacheKey = "product:$id";
$data = $redis->hGetAll($cacheKey);
if (!empty($data)) {
return $data;
}
$stmt = $db->prepare("SELECT * FROM products WHERE id = ?");
$stmt->execute([$id]);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
if ($result) {
$redis->hMSet($cacheKey, $result);
$redis->expire($cacheKey, 3600);
}
return $result;
}
搜索缓存:
function searchProducts($query, $redis, $db) {
$key = 'search:' . md5($query);
$cached = $redis->get($key);
if ($cached) {
return json_decode($cached, true);
}
$results = $db->query("SELECT id, name FROM products WHERE name LIKE '%" . addslashes($query) . "%'")->fetchAll();
$redis->set($key, json_encode($results), 300);
return $results;
}
五、缓存失效与一致性
5.1 产品更新触发缓存清理
在后台管理产品更新逻辑中:
$redis->del("product:$id");
若涉及搜索关键词变更,可选择以较短 TTL 或基于事件机制清理搜索缓存。
5.2 结合消息队列批量失效
在高并发更新场景下,可推送变更事件到 Kafka/RabbitMQ,由订阅服务批量清理 Redis。
六、性能监控指标建议
关注以下指标:
| 监控项 | 说明 |
|---|---|
| Varnish HIT % | Varnish 缓存命中率 |
| Redis HIT % | 业务缓存命中率 |
| 后端 QPS | 后端请求每秒量 |
| 平均响应时间 | 页面响应耗时 |
| Redis 使用内存 | 避免 OOM |
可结合 Prometheus + Grafana 做可视化。
七、基准测试与效果评估
对比未缓存与启用多层缓存的响应性能:
| 场景 | 95% 响应时间 | 吞吐 (req/s) | 后端 CPU 使用 |
|---|---|---|---|
| 无缓存 | 820 ms | 340 | 75% |
| Redis 业务缓存 | 420 ms | 620 | 48% |
| Redis + Varnish 缓存 | 120 ms | 1580 | 22% |
测试工具可使用 ab、wrk、JMeter 等。
结论:引入 Redis 缓存后动态数据读提升明显;再叠加 Varnish 的 HTTP 缓存后,静态与可缓存动态页面的响应性能有大幅度提升,后端压力显著降低。
八、常见问题与优化建议
-
页面内容个性化导致缓存失效
可利用 ESI(Edge Side Includes)机制,将可缓存部分拆分,使 Varnish 缓存静态片段,动态片段由应用端渲染。 -
大规模搜索结果缓存膨胀
可限制只缓存热门关键词,或使用 LFU/LRU 策略控制 Redis 内存。 -
缓存雪崩/击穿
利用互斥锁(mutex)或早期缓存填充策略避免重击。
九、总结
A5数据通过在 CentOS 8 上部署多层级缓存系统:
- Redis 负责业务数据缓存,快速响应产品与搜索数据;
- Varnish 负责 HTTP 层缓存,拦截大量页面请求;
- 结合应用层逻辑,实现缓存失效与一致性控制;
- 监控与调优 保证系统稳定性。
这种架构能够显著提升电商网站的性能,使用户体验更流畅,同时减少后端服务器资源消耗,是中大型电商系统的实用实践方案。

浙公网安备 33010602011771号