缓存不只是浏览器的事
很多人一听到“缓存”,第一反应是浏览器里那个清空历史记录时顺手勾选的“缓存文件”。其实,在实际项目开发中,缓存机制远不止这么简单。它是提升系统响应速度、降低服务器压力的关键手段之一。
为什么项目需要缓存?
设想一个电商网站,商品详情页每天被访问上百万次。如果每次打开页面都去数据库查一遍价格、库存、描述,数据库很快就会扛不住。更别说那些热门商品,反复查询相同数据,纯粹是浪费资源。
这时候缓存就派上用场了。把频繁读取的数据先存到内存里,下次请求直接从内存拿,速度提升几十倍都不夸张。常见的做法是第一次查数据库,顺手把结果写进 Redis 或 Memcached,设置个过期时间,后续请求优先读缓存,等缓存失效再重新加载。
缓存用在哪些地方?
除了页面数据,缓存还能用在很多细节上。比如用户登录状态,传统方式靠 Session 存服务器内存,但分布式部署时会出问题——用户这次请求打到 A 服务器,下次到 B 服务器,Session 对不上。解决方案是把 Session 数据缓存到 Redis,所有服务器共用一份,用户走到哪都能识别。
还有静态资源。前端页面里的 JS、CSS 文件改动不频繁,完全可以交给浏览器缓存。通过设置 HTTP 头 Cache-Control,告诉浏览器“这个文件一个月内不用再下载”,既能减少带宽消耗,也能加快页面打开速度。
代码里怎么加缓存?
以一个简单的 Node.js 接口为例,原本每次请求都查数据库:
app.get('/product/:id', async (req, res) => {
const product = await db.query('SELECT * FROM products WHERE id = ?', [req.params.id]);
res.json(product);
});
加上 Redis 缓存后变成:
app.get('/product/:id', async (req, res) => {
const key = `product:${req.params.id}`;
const cached = await redis.get(key);
if (cached) {
return res.json(JSON.parse(cached));
}
const product = await db.query('SELECT * FROM products WHERE id = ?', [req.params.id]);
await redis.setex(key, 300, JSON.stringify(product)); // 缓存5分钟
res.json(product);
});
就这么几行代码,就能避免大量重复查询。当然,缓存不是万能的,得考虑数据一致性。比如商品价格变了,缓存得及时更新,否则用户看到的就是旧价格。常见做法是在更新数据库的同时,主动删除或刷新对应缓存。
别盲目上缓存
有些项目一开始数据量很小,也照搬大厂那一套,Redis、CDN、本地缓存全堆上去,结果维护成本高,问题还多。其实小项目可以从简单的内存缓存开始,比如用 Map 存临时数据,够用就行。
缓存命中率是关键指标。如果发现大部分请求都没命中缓存,反而增加了额外判断,那可能设计有问题,或者数据本身就不适合缓存。
缓存也是种资源管理思维
说到底,缓存的本质是“用空间换时间”。电脑内存比硬盘快,所以操作系统会把常用文件预加载到内存;手机APP后台切出去再回来,界面秒开,也是因为系统没急着杀掉它的内存。
项目里的缓存逻辑,和这些系统优化思路一脉相承。合理利用,程序更流畅;滥用乱用,反而拖慢整体性能。什么时候该缓,什么时候该查,得看实际场景,不能一刀切。