本帖最后由 AI内容专员 于 2025-4-7 08:14 编辑
设置网站数据缓存是提升性能、降低数据库负载的关键手段,以下是分层次的缓存设置方法,涵盖客户端、服务端到数据库层的缓存策略方法 一、客户端缓存(减少重复请求)
1. 浏览器缓存<link href="styles.css?v=1a2b3c4d" rel="stylesheet">
2. Service Worker(PWA 应用)使用 JavaScript 拦截请求并缓存资源,实现离线访问:
// 注册 Service Worker
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js');
}
// sw.js 示例(缓存静态资源)
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open('v1').then((cache) => {
return cache.addAll(['/styles.css', '/app.js']);
})
);
}); 二、服务端缓存(降低应用层计算压力)
1. 内存缓存(简单场景)Node.js 示例(内存缓存) const cache = {};
function getData(key) {
if (cache[key] && Date.now() < cache[key].expires) {
return cache[key].data;
}
// 无缓存或过期时从数据库读取
const data = fetchFromDB(key);
cache[key] = { data, expires: Date.now() + 300000 }; // 缓存5分钟
return data;
}
2. 分布式缓存(高并发场景)Redis 设置示例 # 安装 Redis
sudo apt-get install redis-server
# 常用命令
redis-cli set user:123 '{"name":"John", "age":30}' EX 3600 # 缓存1小时
redis-cli get user:123Python 集成 Redis import redis
r = redis.Redis(host='localhost', port=6379, db=0)
def get_user(user_id):
key = f"user:{user_id}"
data = r.get(key)
if not data:
data = db.query("SELECT * FROM users WHERE id = %s", user_id)
r.setex(key, 3600, data) # 缓存1小时
return data
3. 页面片段缓存Django 模板缓存示例 <!-- 缓存视图片段(60秒) -->
{% load cache %}
{% cache 60 "header_cache" %}
<header>动态头部内容</header>
{% endcache %} 三、数据库层缓存(减少磁盘 I/O)
1. MySQL 查询缓存
-- 检查是否启用
SHOW VARIABLES LIKE 'query_cache%';
-- 临时启用(配置文件需永久设置)
SET GLOBAL query_cache_type = 1;
SET GLOBAL query_cache_size = 1000000;
2. Redis 作为缓存数据库缓存高频查询结果,如热门商品、排行榜: # 缓存热门商品 Top 100
redis-cli zadd hot_products 1000 "product:123"
redis-cli expire hot_products 600 # 10分钟过期
四、CDN 缓存(加速静态资源)
1. 配置 CDN 缓存规则2. 清除 CDN 缓存 五、缓存策略与注意事项
1. 缓存更新策略策略 | 适用场景 | 示例 | Cache-Aside | 通用读多写少 | 先读缓存,未命中再读数据库并回填 | Write-Through | 强一致性要求 | 写数据库后同步更新缓存 | Write-Behind | 高吞吐量场景(如日志) | 先写缓存,异步批量写入数据库 | 2. 常见问题解决// Java 互斥锁示例
public Object getData(String key) {
Object data = redis.get(key);
if (data == null) {
synchronized (this) {
data = redis.get(key);
if (data == null) {
data = db.query(key);
redis.setex(key, 3600, data);
}
}
}
return data;
3. 监控与调优 六、实战步骤示例
通过分层缓存策略可以显著降低数据库压力并提升响应速度,但是还需要根据业务特点平衡一致性、性能和复杂度,避免过度缓存导致维护困难。 |