你有没有遇到过这种情况:打开一个购物网站,刚加购的商品再刷新就没了;或者在公司内部系统里提交了数据,刷新页面却发现还是旧的?这些问题很可能和服务器的缓存机制有关。
为什么需要缓存?
想象一下,每天上下班高峰期挤地铁,如果每个人进站都要重新验证身份证、银行卡、健康码,那队伍得排到几公里外。服务端也一样,每次用户请求都去数据库查一遍数据,不仅慢,还会把数据库压垮。
缓存就是那个“快速通道”。它把常用的数据先存在内存里,下次请求直接从内存拿,速度能提升几十倍甚至上百倍。比如首页的轮播图、商品分类列表这些不常变的内容,完全没必要每次都查数据库。
缓存怎么嵌入服务端架构?
现代服务端架构中,缓存通常作为独立层存在。常见的模式是应用服务器先查缓存(比如 Redis 或 Memcached),没找到再去数据库查,查到后顺手写一份到缓存里,下一次请求就能命中。
举个例子,一个新闻网站的热门文章页,每分钟可能被访问上万次。如果没有缓存,数据库瞬间就被打满。加上缓存后,第一次访问走数据库并存入 Redis,接下来的 9999 次请求都从 Redis 读取,响应时间从几百毫秒降到几毫秒。
// 伪代码示例:带缓存的用户信息查询
function getUserInfo(userId) {
// 先查缓存
let cacheKey = "user:" + userId;
let userData = redis.get(cacheKey);
if (userData) {
return userData; // 缓存命中,直接返回
} else {
userData = db.query("SELECT * FROM users WHERE id = ?", userId);
redis.setex(cacheKey, 3600, userData); // 写入缓存,有效期1小时
return userData;
}
}
缓存不是万能的
缓存用得好是加速器,用不好就是bug制造机。比如用户修改了头像,但缓存没及时更新,别人看到的还是旧头像。这就涉及缓存一致性问题。
常见做法是“失效策略”:数据一更新,立刻删除对应缓存。下次请求自然会重新从数据库加载新数据。另一种是设置较短的过期时间,牺牲一点实时性换稳定性。
还有些场景不适合缓存,比如用户的登录状态、实时聊天消息。这类数据变化频繁,缓存命中率低,反而增加系统复杂度。
多级缓存:离用户更近一点
除了服务端内存缓存,还可以在靠近用户的地方加缓存。比如 CDN 缓存静态资源,浏览器本地缓存图片文件。这样连请求都不用发到服务器,打开速度飞快。
比如你常刷的短视频 App,点开个人主页时,头像和昵称往往瞬间出现,就是因为这些信息早就缓存在手机本地了。这种多级缓存策略,层层拦截请求,真正做到了“能不找服务器就不找”。